You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:36:03