Go的标准库不具有唯一目的是检查文件是否存在与否(如Python的功能os.path.exists
)。 什么是惯用的方式做到这一点?
Answer 1:
要检查文件不存在,等同于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"); err == nil {
// path/to/whatever exists
} else if os.IsNotExist(err) {
// path/to/whatever does *not* exist
} else {
// Schrodinger: file may or may not exist. See err for details.
// Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence
}
Answer 2:
通过迦勒答案备用张贴在gonuts邮件列表。
[...]这不是实际需要经常和[...]使用
os.Stat
是它需要的情况下很容易。[...]例如:如果你要打开的文件,没有任何理由,以检查其是否存在第一。 该文件可能消失在检查和开放之间的,反正你需要检查
os.Open
错误不管。 所以你只需拨打os.IsNotExist(err)
您尝试打开该文件后,并与其不存在没有处理(如果需要特殊处理)。[...]您不需要检查现有的所有路径(和你不应该)。
os.MkdirAll
工作路径是否已经存在。 (你也需要从该呼叫检查错误。)而不是使用的
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
Answer 3:
您应该使用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
}
这个例子是从提取这里 。
Answer 4:
在通过user11617例子是不正确; 它会报告该文件存在,即使在它没有的情况下,但有一些其他种类的错误。
签名应该是是否存在(字符串)(布尔,误差)。 然后,当它发生时,调用点是没有更好的。
他写会更好,因为该代码:
func Exists(name string) bool {
_, err := os.Stat(name)
return !os.IsNotExist(err)
}
但是,我的建议是:
func Exists(name string) (bool, error) {
_, err := os.Stat(name)
if os.IsNotExist(err) {
return false, nil
}
return err != nil, err
}
Answer 5:
_, 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)
}
Answer 6:
该功能例如:
func file_is_exists(f string) bool {
_, err := os.Stat(f)
if os.IsNotExist(err) {
return false
}
return err == nil
}
Answer 7:
让我们来看看几个方面首先,两者所提供的功能os
的包golang
不是工具,但错误检查器,什么才是我的意思是他们只是一个跨平台上处理错误包装。
所以基本上,如果os.Stat
如果此功能不给,这意味着如果它确实需要检查什么样的错误是,在这里来使用这两个功能的文件存在任何错误os.IsNotExist
和os.IsExist
。
这可以理解为Stat
文件,因为它不存在,或者是它,因为它存在,有一些问题,它抛出错误引发的错误。
这些功能需要的参数是类型的error
,虽然你可能能够通过nil
到它,但它是没有意义的。
这也指出了一个事实,即IsExist is not same as !IsNotExist
,它们是这样两个不同的东西。
所以,如果你想知道,如果给定的文件中去存在,我宁愿最好的办法是现在:
if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
//TODO
}