如何检查文件或目录是否存在?

har*_*ass 117 file go

我想./conf/app.ini在Go代码中检查文件是否存在,但我找不到一个好方法.

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

但是怎么能在Go中完成呢?

Mos*_*afa 176

// 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 true, err
}
Run Code Online (Sandbox Code Playgroud)

编辑添加错误处理.

  • @OlivierAmblet这里没有例外.Go使用`panic`来表示像对象这样的实际"异常".你可以通过调用`recover`来"捕获".明确地将"错误"作为第二个返回值返回是一种非常常见的惯用Go技术.请参阅:http://golang.org/doc/effective_go.html#errors (20认同)
  • 解决方案不是很明确,走得很特别 (12认同)
  • 为什么这种语言的一切都如此复杂? (7认同)
  • 它看起来像'异常编程'.是否有任何资源可以证明这种代码是正式的#golang范式? (4认同)
  • 新的风格是使用 `errors` 包 `iferrors.Is(err, os.ErrNotExist) { /* 句柄不存在 */ }` (4认同)

Den*_*ret 114

你可以用这个:

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

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

  • @SergeyKoulikov可能还有其他错误,例如权限错误. (8认同)
  • 这比接受的答案要好,但是else条款真的有必要吗? (5认同)

小智 18

更多的一个FYI,因为我环顾了几分钟,认为我的问题是一个快速搜索.

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

这是我搜索结果中最受欢迎的答案,但在此处和其他地方,解决方案仅提供存在检查.要检查是否path代表现有目录,我发现我可以轻松地:

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

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


小智 10

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

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
}
Run Code Online (Sandbox Code Playgroud)

资料来源: