我有以下结构:
project/
docs/
index.html
root.html
Run Code Online (Sandbox Code Playgroud)
我正在尝试迭代这个项目结构,以便我可以读取每个文件的内容来处理它们。所以我想说“搜索目录项目”,那么它将搜索所有文件,并且仅搜索第一级目录及其文件,因此如果存在另一个目录中包含文件docs/,它将忽略它。
目前,我尝试使用“path/filepath”库来完成此任务:
func traverse(path string, file os.FileInfo, err error) error {
if file, err := os.Open(file.Name()); err == nil {
defer file.Close()
if fileStat, err := file.Stat(); err == nil {
switch mode := fileStat.Mode(); {
case mode.IsDir():
fmt.Println("it be a directory! lets traverse", file.Name())
filepath.Walk(file.Name(), traverse)
case mode.IsRegular():
fmt.Println("the thingy ", file.Name(), " is a file")
}
} else {
return errors.New("failed to check status")
}
}
return errors.New("failed 2 open file/dir?")
}
Run Code Online (Sandbox Code Playgroud)
然后我从这里调用它:
if err := filepath.Walk("project/", traverse); err != nil {
setupErr("%s", err)
}
Run Code Online (Sandbox Code Playgroud)
请注意,我相对于我的测试目录运行此可执行文件,因此它发现该目录没问题。我的问题实际上是当我运行它时,我得到以下信息:
it be a directory! lets traverse project
it be a directory! lets traverse project
# ^ printed about 20 more times ^
failed 2 open file/dir?
Run Code Online (Sandbox Code Playgroud)
我认为我的递归有点偏离,并且它可能没有更改为目录?任何想法,如果您需要更多信息,请询问,我会更新。
首先,看起来您想要做的事情与您拥有的代码相矛盾。你写了:
所以我想说“搜索目录项目”,那么它将搜索所有文件,并且仅搜索第一级目录及其文件,因此如果在 docs/ 中存在另一个包含文件的目录,它将忽略它。
这是否意味着您只想迭代两级目录(当前目录和下一级目录)并忽略其余目录?
如果是这样,那么您不需要递归,只需一个简单的循环,对当前目录及其每个子目录中的文件执行搜索函数。
您拥有的代码遍历文件系统目录子树。
基本上,filepath.Walk您使用的应该可以为您完成。因此,您要么实现递归步行,要么使用步行,但不能同时使用两者。
其次,您的代码中的递归实现不正确。它缺少对目录的迭代。
因此,打印当前目录及其子目录(但不进一步)中的文件名的代码是:
package main
import (
"fmt"
"io/ioutil"
)
func main() {
items, _ := ioutil.ReadDir(".")
for _, item := range items {
if item.IsDir() {
subitems, _ := ioutil.ReadDir(item.Name())
for _, subitem := range subitems {
if !subitem.IsDir() {
// handle file there
fmt.Println(item.Name() + "/" + subitem.Name())
}
}
} else {
// handle file there
fmt.Println(item.Name())
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23265 次 |
| 最近记录: |