列出文件夹内容时出错

时间:2017-05-14 15:48:20

标签: go

使用Go 1.8.1,我试图写一些处理文件的东西。问题是,虽然filepath.Walk(...)工作正常,但我需要更灵活的东西。所以我转向ioutil.ReadDir(...),只是为了迎接一场壮观的" panic: runtime error: invalid memory address or nil pointer dereference"。我尝试了替代方案(filepath.Glob(...)file.Readdirnames(...)),它们都会导致同样的错误。 真正令人费解的是filepath.Walk(...)使用os.Lstat(...),但当我尝试直接使用os.Lstat(...)时...我得到了同样的错误。 我已经在更新的Ubuntu 16.04 LTS和更新的Fedora 25上尝试了这个,它没有任何区别。

我的Go-fu真的很弱(这是我的第一个应用程序除了"你好世界"),所以任何帮助都表示赞赏。

这里有一些失败的代码:

func glob() {
    infos, err := filepath.Glob("*")
    if err != nil {
        for _, info := range infos {
            fmt.Println(info)
        }
    } else {
        log.Fatal(err.Error())
    }
}

func y() {
    file, err := os.Open(folder)
    println(file.Name())
    defer file.Close()
    infos, err := file.Readdirnames(0)
    //infos, err := ioutil.ReadDir(folder)
    if err != nil {
        for _, info := range infos {
            fmt.Println(info)
        }
    } else {
        log.Fatal(err.Error())
    }
}

func readDir() {
    infos, err := ioutil.ReadDir(folder)
    if err != nil {
        for _, info := range infos {
            fmt.Println(info)
        }
    } else {
        log.Fatal(err.Error())
    }
}

以及这有效:

func walk() {
    err := filepath.Walk(folder, printWalk)
    if err != nil {
        log.Fatal(os.Stderr, "walk failed with error: %v\n", err)
    }
}

func printWalk(path string, info os.FileInfo, err error) error {
    if err != nil {
        return err
    }
    fmt.Println("path:", path, "FileInfo.Name:", info.Name())
    return nil
}

2 个答案:

答案 0 :(得分:1)

您的err支票向后看我。我原以为:

func readDir() {
    infos, err := ioutil.ReadDir(folder)
    if err != nil {
        log.Fatal(err)
    }
    for _, info := range infos {
        fmt.Println(info)
    }
}

一个更为惯用的版本,其folder作为参数并返回任何错误:

func readDir(folder string) error {
    infos, err := ioutil.ReadDir(folder)
    if err != nil {
        return err
    }
    for _, info := range infos {
        fmt.Println(info)
    }
    return nil
}

答案 1 :(得分:0)

您正在错误地检查错误。

if err != nil {  // if there is an error (!)
    // do something (as if there was no error)
} else {
    log.Fatal(err.Error()) // the dereference happens here, where err == nil.
}