为了账号安全,请及时绑定邮箱和手机立即绑定

我正在尝试以广度优先方式遍历文件结构。我收到分段违规

我正在尝试以广度优先方式遍历文件结构。我收到分段违规

Go
largeQ 2022-05-18 15:30:18
我知道ioutil.ReadDir,os.filePath但没有一个以广度优先方式遍历目录。我的方法是调用ioutil.ReadDir根目录的所有内容并将其附加到一个切片中。然后我遍历内容并检查它是否为IsDir[]真,如果为真,则递归调用该函数。package mainimport (    "io/ioutil"    "os")var files []stringvar path stringfunc appendFiles(root string) {    fileInfo, err := ioutil.ReadDir(root)    if err != nil {        return    }    for _, file := range fileInfo {        files = append(files, file.Name())    }    for _, file := range fileInfo {        fileStat, _ := os.Stat(file.Name())        if fileStat.Mode().IsDir() {            // path = path + "/" + file.Name()            appendFiles(file.Name())        }    }}func main() {    appendFiles(".")}
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

问题是它os.Stat()可能会返回一个error你省略的。当这种情况发生时,fileStat可能是,所以在下一行nil调用会出现恐慌。fileStat.Mode()

os.Stat()失败的原因是因为file.Name()是相对的rootfile.Name()它本身存在的机会很小,它必须加入root。如果os.Stat()使用不存在的文件名调用,则返回nil文件信息和非nil错误。

您可以使用filepath.Join()为可以使用的文件构建有效路径os.Stat()。处理错误会更好,例如返回它们,您可以在main().

func appendFiles(root string) error {

    fileInfo, err := ioutil.ReadDir(root)

    if err != nil {

        return fmt.Errorf("ReadDir error: %w", err)

    }

    for _, file := range fileInfo {

        files = append(files, filepath.Join(root, file.Name()))

    }


    for _, file := range fileInfo {

        fullName := filepath.Join(root, file.Name())

        fileStat, err := os.Stat(fullName)

        if err != nil {

            return fmt.Errorf("Stat error: %w", err)

        }

        if fileStat.Mode().IsDir() {

            if err := appendFiles(fullName); err != nil {

                return fmt.Errorf("appendFiles error: %w", err)

            }

        }

    }

    return nil

}


func main() {

    if err := appendFiles("."); err != nil {

        fmt.Println(err)

    }

}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信