如何检查一个文件是否存在?

Go的标准库没有一个函数只是用来检查文件是否存在(比如Python的os.path.exists )。 什么是这样做的惯用方法?

要检查一个文件是否不存在,相当于Python的if not os.path.exists(filename)

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

检查文件是否存在,相当于Python的if os.path.exists(filename)

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

通过回答Caleb Spare张贴在gonuts邮件列表。

[…]它实际上并不经常需要和使用os.Stat是很容易的情况下,它是必需的。

[…]例如:如果打算打开文件,没有理由检查它是否存在。 该文件可能在检查和打开之间消失,无论如何,无论如何,你将需要检查os.Open错误。 所以你只需在打开文件后调用os.IsNotExist(err) ,并在那里处理它的不存在(如果需要特殊处理的话)。

[…]你不需要检查存在的path(你不应该)。

  • os.MkdirAll作品是否path已经存在。 (你也需要检查来自该调用的错误。)

  • 而不是使用os.Create ,你应该使用os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) 。 这样,如果文件已经存在,你会得到一个错误。 此外,这不具有其他文件的竞争条件,不像你的版本,事先检查存在。

取自: https : //groups.google.com/forum/#! msg/golang-nuts/Ayx-BMNdMFo/ 4rL8FFHr8v4J

你应该使用os.Stat()os.IsNotExist()函数,如下例所示:

 // Exists reports whether the named file or directory exists. func Exists(name string) bool { if _, err := os.Stat(name); err != nil { if os.IsNotExist(err) { return false } } return true } 

这个例子是从这里提取的。

  _, err := os.Stat(file) if err == nil { log.Printf("file %s exists", file) } else if os.IsNotExist(err) { log.Printf("file %s not exists", file) } else { log.Printf("file %s stat error: %v", file, err) } 

user11617的示例不正确; 它会报告文件存在,即使在没有的情况下,但有一个其他types的错误。

签名应该是Exists(string)(bool,error)。 然后,碰巧,呼叫站点并不好。

他写的代码会更好:

 func Exists(name string) bool { _, err := os.Stat(name) return !os.IsNotExist(err) } 

但我build议这个:

 func Exists(name string) (bool, error) { err := os.Stat(name) if os.IsNotExist(err) { return false, nil } return err != nil, err }