最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言實現(xiàn)遍歷文件夾

 更新時間:2023年05月26日 15:26:51   作者:技術(shù)顏良  
這篇文章主要為大家詳細(xì)介紹了Go語言實現(xiàn)遍歷文件夾的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的小伙伴可以了解一下

path/filepath 包涉及到路徑操作時,路徑分隔符使用 os.PathSeparator. Go是一個跨平臺的語言,不同系統(tǒng),路徑表示方式有所不同,比如 Unix 和 Windows 差別很大.本包能夠處理所有的文件路徑,不管是什么系統(tǒng).

Go標(biāo)準(zhǔn)庫中還有path, path 和 path/filepath 函數(shù)有點重復(fù),大部分情況下建議使用 path/filepath.

1.示例代碼:package path

package main;
import (
    "fmt"
    "path"
)
//go語言path包的學(xué)習(xí)
func main() {
    //返回路徑的最后一個元素
    fmt.Println(path.Base("./github.com/mojocn/c"));
    //如果路徑為空字符串,返回.
    fmt.Println(path.Base(""));
    //如果路徑只有斜線,返回/
    fmt.Println(path.Base("http:///"));
    //返回等價的最短路徑
    //1.用一個斜線替換多個斜線
    //2.清除當(dāng)前路徑.
    //3.清除內(nèi)部的..和他前面的元素
    //4.以/..開頭的,變成/
    fmt.Println(path.Clean("./github.com/mojocn/../"));
    //返回路徑最后一個元素的目錄
    //路徑為空則返回.
    fmt.Println(path.Dir("./github.com/mojocn/c"));
    //返回路徑中的擴展名
    //如果沒有點,返回空
    fmt.Println(path.Ext("./github.com/mojocn/c/d.jpg"));
    //判斷路徑是不是絕對路徑
    fmt.Println(path.IsAbs("./github.com/mojocn/c"));
    fmt.Println(path.IsAbs("/github.com/mojocn/c"));
    //連接路徑,返回已經(jīng)clean過的路徑
    fmt.Println(path.Join("./a", "b/c", "../d/"));
    //匹配文件名,完全匹配則返回true
    fmt.Println(path.Match("*", "a"));
    fmt.Println(path.Match("*", "a/b/c"));
    fmt.Println(path.Match("\\b", "b"));
    //分割路徑中的目錄與文件
    fmt.Println(path.Split("./github.com/mojocn/c/d.jpg"));
}

2.示例代碼:package path/filepath

filepath.Join("C:/a", "/b", "/c") 拼接目錄

package main;
import (
    "path/filepath"
    "fmt"
    "os"
)
//學(xué)習(xí)filepath包,兼容各操作系統(tǒng)的文件路徑
func main() {
    //返回所給路徑的絕對路徑
    path, _ := filepath.Abs("./1.txt");
    fmt.Println(path);
    //返回路徑最后一個元素
    fmt.Println(filepath.Base("./1.txt"));
    //如果路徑為空字符串,返回.
    fmt.Println(filepath.Base(""));
    //如果路徑只有斜線,返回/
    fmt.Println(filepath.Base("http:///"));
    //返回等價的最短路徑
    //1.用一個斜線替換多個斜線
    //2.清除當(dāng)前路徑.
    //3.清除內(nèi)部的..和他前面的元素
    //4.以/..開頭的,變成/
    fmt.Println(filepath.Clean("C:/github.com/mojocn/../c"));
    fmt.Println(filepath.Clean("./1.txt"));
    //返回路徑最后一個元素的目錄
    //路徑為空則返回.
    fmt.Println(filepath.Dir("./github.com/mojocn/c"));
    fmt.Println(filepath.Dir("C:/github.com/mojocn/c"));
    //返回鏈接文件的實際路徑
    path2, _ := filepath.EvalSymlinks("1.lnk");
    fmt.Println(path2);
    //返回路徑中的擴展名
    //如果沒有點,返回空
    fmt.Println(filepath.Ext("./github.com/mojocn/c/d.jpg"));
    //將路徑中的/替換為路徑分隔符
    fmt.Println(filepath.FromSlash("./github.com/mojocn/c"));
    //返回所有匹配的文件
    match, _ := filepath.Glob("./*.go");
    fmt.Println(match);
    //判斷路徑是不是絕對路徑
    fmt.Println(filepath.IsAbs("./github.com/mojocn/c"));
    fmt.Println(filepath.IsAbs("C:/github.com/mojocn/c"));
    //連接路徑,返回已經(jīng)clean過的路徑
    fmt.Println(filepath.Join("C:/a", "/b", "/c"));
    //匹配文件名,完全匹配則返回true
    fmt.Println(filepath.Match("*", "a"));
    fmt.Println(filepath.Match("*", "C:/github.com/mojocn/c"));
    fmt.Println(filepath.Match("\\b", "b"));
    //返回以basepath為基準(zhǔn)的相對路徑
    path3, _ := filepath.Rel("C:/github.com/mojocn", "C:/github.com/mojocn/c/d/../e");
    fmt.Println(path3);
    //將路徑使用路徑列表分隔符分開,見os.PathListSeparator
    //linux下默認(rèn)為:,windows下為;
    fmt.Println(filepath.SplitList("C:/windows;C:/windows/system"));
    //分割路徑中的目錄與文件
    dir, file := filepath.Split("C:/github.com/mojocn/c/d.jpg");
    fmt.Println(dir, file);
    //將路徑分隔符使用/替換
    fmt.Println(filepath.ToSlash("C:/github.com/mojocn"));
    //返回分區(qū)名
    fmt.Println(filepath.VolumeName("C:/github.com/mojocn/c"));
    //遍歷指定目錄下所有文件
    filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
        fmt.Println(path)
        return nil
    })
}

3. 文件夾遍歷

Go 語言中進(jìn)行目錄遍歷的原生方法主要是以下3種:

  • filepath.Walk()
  • ioutil.ReadDir()
  • os.File.Readdir()

性能是越底層越高(上層其實是對底層API的封裝).

3.1 filepath.Walk()

遍歷根目錄(root)下的文件樹,為樹中的每個文件或目錄(包括根目錄)調(diào)用walkFn.所有在訪問文件和目錄時出現(xiàn)的錯誤都由walkFn過濾. 遍歷按詞法順序進(jìn)行,這使得輸出是確定的,但對于非常大的目錄來說,遍歷可能是低效的. filepath.Walk()不會跟進(jìn)符號鏈接.

package main
import (
    "flag"
    "fmt"
    "os"
    "path/filepath"
)
const (
    layout = "2006-01-02 15:04:05"
)
func VisitFile(fp string, fi os.FileInfo, err error) error {
    if err != nil {
        fmt.Println(err) // can't walk here,
        return nil       // but continue walking elsewhere
    }
    if fi.IsDir() {
        return nil // not a file.  ignore.
    }
    // 過濾輸出內(nèi)容
    matched, err := filepath.Match("*.txt", fi.Name())
    if err != nil {
        fmt.Println(err) // malformed pattern
        return err       // this is fatal.
    }
    if matched {
        // fmt.Println(fp)
        fmt.Printf("Name: %s, ModifyTime: %s, Size: %v\n", fp, fi.ModTime().Format(layout), fi.Size())
    }
    return nil
}
func main() {
    var path = flag.String("path", ".", "The path to traverse.")
    flag.Parse()
    filepath.Walk(*path, VisitFile)
}

3.2 ioutil.ReadDir

filepath.Walk()會自動遍歷子目錄,但有些時候我們不希望這樣,如果只想看當(dāng)前目錄, 或手動指定某幾級目錄中的文件,這個時候,可以使用 ioutil.ReadDir 進(jìn)行替代.

package main
import (
    "flag"
    "fmt"
    "io/ioutil"
    "log"
)
func main() {
    var path = flag.String("path", ".", "The path to traverse.")
    flag.Parse()
    files, err := ioutil.ReadDir(*path)
    if err != nil {
        log.Fatal(err)
    }
    for _, file := range files {
        fmt.Println(file.Name())
    }
}

3.3 os.File.os.File.Readdir

package main
import (
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
)
// https://stackoverflow.com/questions/14668850/list-directory-in-go/49196644#49196644
func main() {
    var (
        root  string
        err   error
    )
    // root = "/home/manigandan/Desktop/Manigandan/sample"
    root = "."
      f, err := os.Open(root)
      if err != nil {
          return files, err
      }
      fileInfo, err := f.Readdir(-1)
      f.Close()
      if err != nil {
          return files, err
      }
      for _, file := range fileInfo {
          fmt.Println(file.Name())
      }
}

3.4 方法封裝的一個演示和對比

package main
import (
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
)
// https://stackoverflow.com/questions/14668850/list-directory-in-go/49196644#49196644
func main() {
    var (
        root  string
        files []string
        err   error
    )
    // root = "/home/manigandan/Desktop/Manigandan/sample"
    root = "."
    // filepath.Walk
    files, err = FilePathWalkDir(root)
    if err != nil {
        panic(err)
    }
    // ioutil.ReadDir
    files, err = IOReadDir(root)
    if err != nil {
        panic(err)
    }
    //os.File.Readdir
    files, err = OSReadDir(root)
    if err != nil {
        panic(err)
    }
    for _, file := range files {
        fmt.Println(file)
    }
}
func FilePathWalkDir(root string) ([]string, error) {
    var files []string
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            files = append(files, path)
        }
        return nil
    })
    return files, err
}
func IOReadDir(root string) ([]string, error) {
    var files []string
    fileInfo, err := ioutil.ReadDir(root)
    if err != nil {
        return files, err
    }
    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}
func OSReadDir(root string) ([]string, error) {
    var files []string
    f, err := os.Open(root)
    if err != nil {
        return files, err
    }
    fileInfo, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return files, err
    }
    for _, file := range fileInfo {
        files = append(files, file.Name())
    }
    return files, nil
}

以上就是Go語言實現(xiàn)遍歷文件夾的詳細(xì)內(nèi)容,更多關(guān)于Go遍歷文件夾的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang中單向channel的語法介紹

    golang中單向channel的語法介紹

    通過消息來共享數(shù)據(jù)是golang的一種設(shè)計哲學(xué),channel則是這種哲理的體現(xiàn)。下面這篇文章主要給大家介紹了關(guān)于golang中單向channel語法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。
    2017-07-07
  • go語言切片slice使用細(xì)節(jié)和注意事項整理大全

    go語言切片slice使用細(xì)節(jié)和注意事項整理大全

    這篇文章主要給大家介紹了關(guān)于go語言切片slice使用細(xì)節(jié)和注意事項整理的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Go?中的空白標(biāo)識符下劃線

    Go?中的空白標(biāo)識符下劃線

    這篇文章主要介紹了Go?中的空白標(biāo)識符下劃線,空白標(biāo)識符是未使用的值的占位符,由下劃線(_)表示,下文對其相關(guān)介紹需要的小伙伴可以參考一下
    2022-03-03
  • go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作

    go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作

    這篇文章主要介紹了go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go語言學(xué)習(xí)教程之goroutine和通道的示例詳解

    Go語言學(xué)習(xí)教程之goroutine和通道的示例詳解

    這篇文章主要通過A?Tour?of?Go中的例子進(jìn)行學(xué)習(xí),以此了解Go語言中的goroutine和通道,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-09-09
  • Go語言的限流與熔斷機制的多種方法實現(xiàn)

    Go語言的限流與熔斷機制的多種方法實現(xiàn)

    限流和熔斷是保障系統(tǒng)穩(wěn)定性的重要機制,它們可以防止系統(tǒng)因過載而崩潰,提高系統(tǒng)的可用性和可靠性,本文就來詳細(xì)的介紹一下Go語言的限流與熔斷機制的多種方法實現(xiàn),感興趣的可以了解一下
    2026-04-04
  • 基于golang channel實現(xiàn)的輕量級異步任務(wù)分發(fā)器示例代碼

    基于golang channel實現(xiàn)的輕量級異步任務(wù)分發(fā)器示例代碼

    這篇文章主要給大家介紹了關(guān)于基于golang channel實現(xiàn)的輕量級異步任務(wù)分發(fā)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 再次探討go實現(xiàn)無限 buffer 的 channel方法

    再次探討go實現(xiàn)無限 buffer 的 channel方法

    我們知道go語言內(nèi)置的channel緩沖大小是有上限的,那么我們自己如何實現(xiàn)一個無限 buffer 的 channel呢?今天通過本文給大家分享go實現(xiàn)無限 buffer 的 channel方法,感興趣的朋友一起看看吧
    2021-06-06
  • Go語言內(nèi)建函數(shù)len的使用

    Go語言內(nèi)建函數(shù)len的使用

    Go語言中的len函數(shù)是一個內(nèi)建函數(shù),用于獲取數(shù)組、切片、字符串、映射和通道等數(shù)據(jù)類型的長度或大小,本文介紹了len函數(shù)在不同數(shù)據(jù)類型中的使用場景和特點,感興趣的可以了解一下
    2024-10-10
  • golang1.23版本之前 Timer Reset方法無法正確使用

    golang1.23版本之前 Timer Reset方法無法正確使用

    在Go 1.23之前,使用`time.Reset`函數(shù)時需要先調(diào)用`Stop`并明確從timer的channel中抽取出東西,以避免潛在的問題,然而,這在實際代碼中難以實現(xiàn),因為設(shè)置定時器狀態(tài)和發(fā)送channel的操作并不是原子的,在某些情況下,這會導(dǎo)致timer在不應(yīng)該觸發(fā)時提前觸發(fā)
    2025-01-01

最新評論

永定县| 读书| 哈密市| 平山县| 泊头市| 南阳市| 伊金霍洛旗| 施甸县| 民乐县| 松桃| 文成县| 双柏县| 盐城市| 肥乡县| 神池县| 甘泉县| 纳雍县| 垦利县| 泗阳县| 武强县| 九江县| 三都| 合作市| 松潘县| 安图县| 高雄市| 于都县| 宕昌县| 内丘县| 蒙城县| 平阳县| 西贡区| 五莲县| 台中市| 唐海县| 贺兰县| 柳江县| 瓦房店市| 紫云| 平邑县| 华安县|