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

我知道ioutil.ReadDir,os.filePath但没有一个以广度优先方式遍历目录。我的方法是调用ioutil.ReadDir根目录的所有内容并将其附加到一个切片中。然后我遍历内容并检查它是否为IsDir[]真,如果为真,则递归调用该函数。


package main


import (

    "io/ioutil"

    "os"

)


var files []string

var path string


func 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(".")

}


largeQ
浏览 108回答 1
1回答

万千封印

问题是它os.Stat()可能会返回一个error你省略的。当这种情况发生时,fileStat可能是,所以在下一行nil调用会出现恐慌。fileStat.Mode()而os.Stat()失败的原因是因为file.Name()是相对的root,file.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)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go