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


131

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

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

但是如何在Go中完成呢?


7
还要注意,根据您将如何使用此信息,您会遇到竞争状况。您只能说不久前该文件不存在。当您进行测试时,情况可能恰恰相反。通常,在执行您打算执行的任何操作时进行检查要好得多(例如,在打开现有文件或创建新文件之前不要进行检查,而在执行f, err := os.Open(name)f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)然后进行检查os.IsNotExist(err))。
Dave C

Answers:


189
// 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
}

编辑以添加错误处理。


4
在我看来,这就像“异常编程”。是否有任何资源可以证明这种代码是正式的#golang范例?
Olivier Amblet 2012年

21
@OlivierAmblet这里没有例外。Go panic用于实际的“异常”对象。您可以通过调用来“赶上” recover。显式返回a err作为第二个返回值是一种非常普遍的惯用Go技术。请参阅:golang.org/doc/effective_go.html#errors
Chris Pfohl 2013年

13
解决方案不是很严格,走的很特别
zhaozhi14 2014年

1
确实没有布尔值Exists函数,但是如果您只想检查文件是否存在,则应用程序代码可以更简单:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
为什么用这种语言的一切都那么复杂?
顶级猫


22

仅供参考,因为我环顾了几分钟,认为我的问题可以快速查找。

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

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

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

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



-2

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

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
    }
}

这与DenysSéguret的答案重复。
StardustGogeta
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.