Filepath.Walk 在 Windows 中 Go 无法正确拾取 C: 驱动器下的文件夹

Filepath.Walk in Go not picking up folders under C: drive properly in Windows

我正在使用 Go 中的 Filepath.Walk 来尝试递归地获取 C: 下的所有文件夹。然而,它只是 returns 以 $Recycle.Bin 开头的子文件夹。我在这里做错了什么?

package main

import (
    "fmt"
    "path/filepath"
    "os"
)

func main() {
    array := Subfolders("C:")
    for _,value := range array {
        fmt.Println(value)
    }
}

func Subfolders(path string) (paths []string) {
    filepath.Walk(path, func(newPath string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if info.IsDir() {
            paths = append(paths, newPath)
        }
        return nil
    })  
    return paths
}

Output:
C:
C:$Recycle.Bin
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$R0L9M20
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$R22ZOD9
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$R3LS9P4
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$R4T2IGU
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$R8TZIET
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$R9QQZB9
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RA71HY3
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RBOC0V4.com
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RBOC0V4.com\go-fsnotify
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$REJFS3Z
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RF9A1Y6
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$ROMESWQ
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RP4CYID
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RQHMPV5
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RV0K99H
C:$Recycle.Bin\S-1-5-21-310629982-3373693989-3733510080-1000$RX54T04

我在 C: 下还有许多其他文件夹,filepath.walk 无法获取这些文件夹。我想知道背后的原因是什么。

编辑


感谢您的回答,我能够解决以下问题:-

func Subfolders(path string) (paths []string) {
    filepath.Walk(path, func(newPath string, info os.FileInfo, err error) error {
        if err != nil {
            log.Println(err)
            return filepath.SkipDir
        }

        if info.IsDir() {
            paths = append(paths, newPath)
        }
        return nil
    })

您在不记录错误的情况下盲目返回错误。从回调返回非 nil 错误是 filepath.Walk 中止的信号。

可能有一些您无权访问的文件或其他内容。

您正在返回一个错误,因此它停止行走路径。正如 the spec 所述,只要返回错误(除了一种特殊情况),处理就会停止。如果您想继续处理并忽略错误,只需 return nil 即可。

运行 它在我的机器上让我在一个文件上出现 Access is denied 错误,然后导致步行失败。之所以只看到$Recycle.Bin是因为它刚好是目录中的第一个文件夹,在它到达任何其他文件夹之前就被杀死了。