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"); 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
}
Caleb Spare的回答发布在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
您应该使用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
}
这个例子是从here中提取的。
example by user11617不正确;它会报告该文件存在,即使它没有,但有一些其他类型的错误。
签名应该是Exists(字符串)(bool,错误)。然后,实际上,呼叫站点并没有更好。
他写的代码更好:
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
}
_, 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)
}
功能示例:
func file_is_exists(f string) bool {
_, err := os.Stat(f)
if os.IsNotExist(err) {
return false
}
return err == nil
}
让我们首先看几个方面,os
golang
包提供的功能不是实用程序而是错误检查器,我的意思是它们只是一个处理跨平台错误的包装器。
所以基本上如果os.Stat
如果这个函数没有给出任何意味着该文件存在的错误,那么你需要检查它是什么样的错误,这里有使用这两个函数os.IsNotExist
和os.IsExist
。
这可以理解为文件抛出错误的Stat
,因为它不存在或抛出错误,因为它存在并且存在一些问题。
这些函数所采用的参数是error
类型,尽管你可能能够将nil
传递给它但它没有意义。
这也指出了IsExist is not same as !IsNotExist
的事实,它们是两种不同的东西。
所以现在如果你想知道go中是否存在给定文件,我希望最好的方法是:
if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
//TODO
}