我正在递归地遍历一个给定的目录,并将找到的文件名和大小存储在map[string]uint32
中。我发现了一篇使用path/filepath/WalkDir函数和WalkDirFunc描述how to recursively walk a specified directory的帖子。
我对Go语言比较陌生,还没有找到一种方法来将Map的引用传递给WalkDirFunc
,因为它的签名只指定了三个参数:
func main() {
args := os.Args
if len(args) != 2 {
msg := fmt.Sprintf("Usage: %v <path_to_directory>", args[0])
log.Fatal(msg)
}
fullPath := args[1]
dirMap := make(map[string]uint32)
filepath.WalkDir(fullPath, walk)
}
// how to create parameter accepting &map[string]uint32
func walk(path string, entry fs.DirEntry, err error) error {
if err != nil {
return err
}
if !entry.IsDir() {
// add entry and it's size to dirMap
file, err := os.Stat(path)
if err != nil {
log.Println("Error determining file size:", err)
}
size := file.Size()
// add path and size to dirMap
} else if entry.IsDir() {
// recurse here
} else {
log.Println("Unhandled branch:")
log.Println(entry.Info())
}
return nil
}
编辑:因为walk
是WalkDirFunc
传递给filepath.walkDir
的Map,所以需要从这里开始传递Map,在Python中,我会使用命名参数来完成这个任务,但是在Go语言中,最好的方法是什么呢?
func main() {
args := os.Args
...
fullPath := args[1]
dirMap := make(map[string]uint32)
// dirMap should be passed here
filepath.WalkDir(fullPath, walk)
}
型
1条答案
按热度按时间bvjxkvbb1#
使用closure。将漫游更改为:
像这样调用WalkDir:
在此处运行示例:https://go.dev/play/p/rjV2rSBsUDz