Go中如何判断一个文件是否存在?

新手上路,请多包涵

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

原文由 Sridhar Ratnakumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 968
2 个回答

检查文件是否不存在,相当于 Python 的 if not os.path.exists(filename)

 if _, err := os.Stat("/path/to/whatever"); errors.Is(err, os.ErrNotExist) {
  // 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 errors.Is(err, os.ErrNotExist) {
  // 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

}

原文由 Sridhar Ratnakumar 发布,翻译遵循 CC BY-SA 4.0 许可协议

Caleb Sparegonuts 邮件列表中发布的回答。

[…] 它实际上并不经常需要并且 […] 使用 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

原文由 OscarRyz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题