Go中使用filepath.WalkDir()遍历目录时如何排除根目录?
问题原因
filepath.WalkDir 遍历的起点就是你传入的根目录,回调函数会优先对根目录本身触发一次调用,所以你的代码会把根目录名也加入结果集。
方案1:修改WalkDir回调跳过根目录(适合需要递归遍历所有层级子目录的场景)
直接在回调内判断当前路径是否为根目录,是就跳过不加入结果,不需要后续修改切片,逻辑最直接:
func getDirs(root_dir string) []string { var dirs []string // 提前标准化根目录路径,兼容跨平台路径格式差异 cleanRoot := filepath.Clean(root_dir) err := filepath.WalkDir(root_dir, func(path string, d fs.DirEntry, err error) error { // 根目录直接跳过 if filepath.Clean(path) == cleanRoot { return nil } if d.IsDir() { dirs = append(dirs, filepath.Base(path)) } return nil }) if err != nil { panic(fmt.Sprintf("error walking path %q: %v", root_dir, err)) } return dirs }
方案2:用os.ReadDir实现(适合仅需要根目录下一级子目录的场景)
如果你的需求只是获取传入根目录的直接子目录,不需要递归遍历深层子目录,用os.ReadDir性能更好、逻辑更简单,天然不会遍历到根目录本身,也不会处理子目录下的内容:
func getDirs(root_dir string) []string { entries, err := os.ReadDir(root_dir) if err != nil { panic(fmt.Sprintf("error read dir %q: %v", root_dir, err)) } var dirs []string for _, entry := range entries { if entry.IsDir() { dirs = append(dirs, entry.Name()) } } return dirs }
内容的提问来源于stack exchange,提问作者u15p7fgy863eiq5
相关产品推荐
相关产品推荐

