回答 的 迦勒备用 强> 张贴在 发疯 邮件列表。
[...]实际上并不经常需要和[...]使用 os.Stat 是 对于需要它的情况来说足够简单。 [...]例如:如果要打开文件,则没有理由先检查它是否存在。检查和打开之间文件可能会消失,无论如何你需要检查 os.Open 错误无论如何所以你只需打电话 os.IsNotExist(err) 你尝试之后 打开文件,并在那里处理它不存在(如果需要特殊处理)。 [...]您根本不需要检查存在的路径(您不应该)。 os.MkdirAll 无论路径是否已存在,均可正常工作。 (您还需要检查该呼叫的错误。) 而不是使用 os.Create ,你应该使用 os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) 。这样,如果文件已存在,您将收到错误。此外,没有其他制作文件的竞争条件,与预先检查存在的版本不同。
[...]实际上并不经常需要和[...]使用 os.Stat 是 对于需要它的情况来说足够简单。
os.Stat
[...]例如:如果要打开文件,则没有理由先检查它是否存在。检查和打开之间文件可能会消失,无论如何你需要检查 os.Open 错误无论如何所以你只需打电话 os.IsNotExist(err) 你尝试之后 打开文件,并在那里处理它不存在(如果需要特殊处理)。
os.Open
os.IsNotExist(err)
[...]您根本不需要检查存在的路径(您不应该)。
os.MkdirAll 无论路径是否已存在,均可正常工作。 (您还需要检查该呼叫的错误。)
os.MkdirAll
而不是使用 os.Create ,你应该使用 os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) 。这样,如果文件已存在,您将收到错误。此外,没有其他制作文件的竞争条件,与预先检查存在的版本不同。
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
该 例如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) }
检查文件是否不存在,等同于Python if not os.path.exists(filename) :
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 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 }
功能示例:
func file_is_exists(f string) bool { _, err := os.Stat(f) if os.IsNotExist(err) { return false } return err == nil }
让我们首先看几个方面,这两个方面都提供了功能 os 包裹 golang 不是实用程序而是错误检查器,我的意思是它们只是处理跨平台错误的包装器。
os
golang
所以基本上如果 os.Stat 如果这个函数没有给出任何意味着该文件存在的错误,那么你需要检查它是什么类型的错误,这里有使用这两个函数 os.IsNotExist 和 os.IsExist 。
os.IsNotExist
os.IsExist
这可以理解为 Stat 抛出错误的文件,因为它不存在或抛出错误,因为它存在并且存在一些问题。
Stat
这些函数采用的参数是类型 error ,虽然你可能会通过 nil 对它,但它没有意义。
error
nil
这也指出了这样一个事实 IsExist is not same as !IsNotExist ,他们是两种不同的东西。
IsExist is not same as !IsNotExist
所以现在如果你想知道go中是否存在给定文件,我希望最好的方法是:
if _, err := os.Stat(path/to/file); !os.IsNotExist(err){ //TODO }