150

我想检查./conf/app.ini我的 Go 代码中是否存在文件,但我找不到这样做的好方法。

我知道 Java 中有一个 File: 方法public boolean exists(),如果文件或目录存在,则返回 true。

但是如何在 Go 中做到这一点?

4

6 回答 6

225
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

编辑添加错误处理。

于 2012-05-09T06:23:12.000 回答
135

你可以使用这个:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

请参阅: http: //golang.org/pkg/os/#IsNotExist

于 2012-05-09T06:15:36.980 回答
31

更多的仅供参考,因为我环顾了几分钟,认为我的问题可以快速搜索。

如何检查路径是否代表 Go 中的现有目录?

这是我的搜索结果中最受欢迎的答案,但在这里和其他地方,解决方案只提供存在检查。要检查是否path代表现有目录,我发现我可以很容易地:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

我的部分问题是我希望path/filepath包包含 isDir() 函数。

于 2016-11-16T04:20:33.093 回答
19

检查文件是否存在的简单方法:

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
    // path/to/whatever does not exist
}

if _, err := os.Stat("/path/to/whatever"); err == nil {
    // path/to/whatever exists
}

资料来源:

于 2018-06-28T07:35:32.500 回答
0

我使用以下函数检查我的目录是否有任何错误。它与以前的答案非常相似,但我认为不嵌套ifs 会使代码更清晰。它用于从目录路径go-homedir中删除并返回更好的错误消息,但如果您不需要它们的功能,很容易将它们删除。~pkg/errors

// validateDirectory expands a directory and checks that it exists
// it returns the full path to the directory on success
// validateDirectory("~/foo") -> ("/home/bbkane/foo", nil)
func validateDirectory(dir string) (string, error) {
    dirPath, err := homedir.Expand(dir)
    if err != nil {
        return "", errors.WithStack(err)
    }
    info, err := os.Stat(dirPath)
    if os.IsNotExist(err) {
        return "", errors.Wrapf(err, "Directory does not exist: %v\n", dirPath)
    }
    if err != nil {
        return "", errors.Wrapf(err, "Directory error: %v\n", dirPath)

    }
    if !info.IsDir() {
        return "", errors.Errorf("Directory is a file, not a directory: %#v\n", dirPath)
    }
    return dirPath, nil
}

此外,重复@Dave C 的评论,如果您检查目录是否存在的原因是将文件写入其中,通常最好尝试打开它以处理之后的错误:

// O_EXCL - used with O_CREATE, file must not exist
file, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
if err != nil {
    return errors.WithStack(err)
}
defer file.Close()
于 2020-10-30T22:14:22.323 回答
-3

有一种简单的方法可以检查您的文件是否存在:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}
于 2018-01-23T02:52:02.480 回答