通過go遍歷目錄獲取文件列表
本文將會列舉三種方法
by Using:
filepath.Walk
ioutil.ReadDir
os.File.Readdir
使用filepath.Walk
path/filepath 標准庫的包提供了便捷的Walk方法,它能自動的掃描子目錄,使用起來也很簡單
package main import ( "fmt" "os" "path/filepath" ) func main() { var files []string root := "/some/folder/to/scan" err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { files = append(files, path) return nil }) if err != nil { panic(err) } for _, file := range files { fmt.Println(file) } }
使用ioutil.ReadDir
filepath.Walk是很方便但是它會掃描所有子文件夾,缺省情況下,但這有時候不是我們想要的需求
go的標准庫還提供了ioutil.ReadDir
ioutil.ReadDir需要一個string類型的文件夾路徑然后返回一個os.FileInfo的切片,在上文中提到過。
package main import ( "fmt" "io/ioutil" "log" ) func main() { files, err := ioutil.ReadDir(".") if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file.Name()) } }
使用os.File.Readdir
ReadDir內部的實現方式
// ReadDir reads the directory named by dirname and returns // a list of directory entries sorted by filename. func ReadDir(dirname string) ([]os.FileInfo, error) { f, err := os.Open(dirname) if err != nil { return nil, err } list, err := f.Readdir(-1) f.Close() if err != nil { return nil, err } sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() }) return list, nil }
我們可以看到它只掃描文件夾目錄,然后將文件通過名字排序。如果我們不需要這種排序我們可以這樣:
package main import ( "fmt" "log" "os" ) func main() { dirname := "." f, err := os.Open(dirname) if err != nil { log.Fatal(err) } files, err := f.Readdir(-1) f.Close() if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file.Name()) } }
Go獲取當前項目絕對路徑
package main import ( "fmt" "os" "path/filepath" ) func main() { //獲取當前項目絕對路徑 path, err2 := os.Executable() if err2 != nil { fmt.Println(err2) } dir := filepath.Dir(path) fmt.Println("111", path) // /Users/mac/repose/idphoto_server_lite/test/test3 fmt.Println("2222", dir) // /Users/mac/repose/idphoto_server_lite/test }