如何检查一个文件是否存在?
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 }