【问题标题】:Filepath.Walk in Go not picking up folders under C: drive properly in WindowsFilepath.Walk in Go 不拾取 C: 下的文件夹在 Windows 中正确驱动
【发布时间】:2015-10-16 13:40:24
【问题描述】:

我正在使用 Go 中的 Filepath.Walk 尝试以递归方式获取 C: 下的所有文件夹。但是它只返回以 $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
    })

【问题讨论】:

    标签: windows go filepath


    【解决方案1】:

    您盲目地返回错误而不记录它们。从回调中返回非nil 错误是filepath.Walk 中止的信号。

    大概有一些你无权访问的文件,或者什么。

    【讨论】:

    • 这完全有道理。一个菜鸟的错误。谢谢你指出。我需要更多地了解 Go 中的错误处理。
    【解决方案2】:

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

    在我的机器上运行它会在一个文件上给我一个Access is denied 错误,然后核对步行。原因是只看到$Recycle.Bin是因为它恰好是目录中的第一个文件夹,并且在它到达任何其他文件夹之前就被杀死了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2019-04-02
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多