我正在使用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
})
答案 0 :(得分:4)
您在不记录错误的情况下盲目地返回错误。从回调中返回非nil
错误是filepath.Walk
中止的信号。
可能有一些你无法访问的文件或其他内容。
答案 1 :(得分:1)
您正在返回错误,因此它会停止走路。正如the spec所述,每当返回错误时(除了一个特殊情况),处理停止。如果您想继续处理并忽略错误,请改为return nil
。
在我的机器上运行它会在一个文件上出现Access is denied
错误,然后核对行走。原因只是看到$Recycle.Bin
是因为它恰好是目录中的第一个文件夹,并且walk在它可以到达任何其他文件夹之前被杀死。