文件在 Go 中既存在又不存在?
Posted
技术标签:
【中文标题】文件在 Go 中既存在又不存在?【英文标题】:File both exists and not exists in Go? 【发布时间】:2014-09-19 17:44:50 【问题描述】:这个 Go 程序说一个文件既不存在也不不存在有什么原因吗?大概是其中之一吧?
package main
import (
"fmt"
"log"
"os"
"path/filepath"
)
func main()
for _, fn := range os.Args[1:]
src, _ := filepath.Abs(fn)
fmt.Println(fn)
fmt.Println(src)
if _, e := os.Stat(src); os.IsExist(e)
log.Fatalf("Does exist: %s", src)
if _, e := os.Stat(src); os.IsNotExist(e)
log.Fatalf("Does not exist: %s", src)
【问题讨论】:
【参考方案1】:os.IsExist 和 os.IsNotExist 函数不会测试相反的条件,即使名称似乎暗示它们会测试。
函数os.IsExist 在由于文件已存在而导致操作失败时返回true。当文件不存在导致操作失败时,函数os.IsNotExist返回true。
函数 os.Stat 总是返回 os.IsExist(err) == false 的错误。 os.Stat 函数永远不会因为文件存在而失败。
带有 O_CREAT 的函数 os.OpenFile 总是返回错误 os.IsNotExist(err) == false。因为 os.OpenFile 和 O_CREAT 的目的是创建文件,所以文件丢失绝不是错误。
【讨论】:
【参考方案2】:如果文件存在,某些函数会失败。这种系统调用返回的错误将满足os.IsExist()
。一个这样的系统调用是os.OpenFile()
,带有标志O_CREAT
和O_EXCL
。如果文件不存在,其他函数会失败,例如没有 O_CREAT
标志的 os.OpenFile
。这种系统调用返回的错误将满足os.IsNotExist()
。 nil
错误不满足 os.IsExist()
和 os.IsNotExist()
,因为它不是失败条件。
在您的示例中,如果您尝试统计的文件不存在,os.Stat()
函数可能会失败。如果文件存在,它也可能失败,但不是因为文件存在。因此,os.IsExist(e)
将始终为os.Stat()
函数产生的错误产生false
。
【讨论】:
那么,您是说os.IsExist()
可以为存在的文件返回false?
@Ana 是的。 os.IsExist()
对 错误 进行分类。如果错误e
的原因是文件的存在,则os.IsExist(e)
为真。 nil
错误不是正确的错误,因为它表示成功,因此没有原因。【参考方案3】:
检查文件是否存在的最佳方法(其中 src = 文件路径):
if _, err := os.Stat(src); err == nil || os.IsExist(err)
// your code here if file exists
【讨论】:
以上是关于文件在 Go 中既存在又不存在?的主要内容,如果未能解决你的问题,请参考以下文章