Go - 遍历当前目录中的directores / files

时间:2015-07-30 16:28:38

标签: go directory

我有以下结构:

project/
    docs/
        index.html
    root.html

我正在尝试遍历此项目结构,以便我可以读取每个文件的内容来处理它们。所以我想说“搜索目录项目”,然后它将搜索所有文件,只搜索第一级目录及其文件,所以如果有另一个目录中有一个文件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?")
}

然后我从这里打电话:

if err := filepath.Walk("project/", traverse); err != nil {
    setupErr("%s", err)
}

请注意,我相对于我的测试目录运行此可执行文件,因此它可以找到目录。我的问题实际上是当我运行它时,我得到以下内容:

it be a directory! lets traverse project
it be a directory! lets traverse project
# ^ printed about 20 more times ^
failed 2 open file/dir?

我认为我的递归有点过时了,也许它不会改变到目录中?任何想法,如果您需要更多信息,请询问,我会更新。

2 个答案:

答案 0 :(得分:1)

首先,看起来你想做的事情与你拥有的代码相矛盾。你写道:

  

所以我想说"搜索目录项目",然后它将搜索所有文件,只搜索第一级目录及其文件,所以如果有另一个目录带有文件在docs /里面,它会忽略它。

这是否意味着您只想迭代两个级别的目录(当前和下面一个)并忽略其余目录?

如果是这样,那么你不需要递归,只需要一个简单的循环,它对当前目录中的文件及其每个子目录执行搜索功能。

您遍历文件系统目录子树的代码。

基本上,您使用的filepath.Walk应该为您完成。所以你要么实现递归步行要么使用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())
        }
    }
}

答案 1 :(得分:0)

  

遍历以root为根的文件树,为每个文件调用walkFn   或树中的目录,包括root。出现的所有错误   访问文件和目录由walkFn过滤。文件是   按词汇顺序走,这使输出确定性但是   意味着对于非常大的目录,Walk可能效率低下。步行   不遵循符号链接。