如何检查Go中是否存在文件?

问题描述 投票:339回答:7

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

file go standard-library
7个回答
602
投票

要检查文件是否不存在,等同于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


}

109
投票

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


25
投票

您应该使用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中提取的。


12
投票

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
}

9
投票
    _, 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)
    }

6
投票

功能示例:

func file_is_exists(f string) bool {
    _, err := os.Stat(f)
    if os.IsNotExist(err) {
        return false
    }
    return err == nil
}

3
投票

让我们首先看几个方面,os golang包提供的功能不是实用程序而是错误检查器,我的意思是它们只是一个处理跨平台错误的包装器。

所以基本上如果os.Stat如果这个函数没有给出任何意味着该文件存在的错误,那么你需要检查它是什么样的错误,这里有使用这两个函数os.IsNotExistos.IsExist

这可以理解为文件抛出错误的Stat,因为它不存在或抛出错误,因为它存在并且存在一些问题。

这些函数所采用的参数是error类型,尽管你可能能够将nil传递给它但它没有意义。

这也指出了IsExist is not same as !IsNotExist的事实,它们是两种不同的东西。

所以现在如果你想知道go中是否存在给定文件,我希望最好的方法是:

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
© www.soinside.com 2019 - 2024. All rights reserved.