为了账号安全,请及时绑定邮箱和手机立即绑定

文件在 Go 中既存在又不存在?

文件在 Go 中既存在又不存在?

Go
料青山看我应如是 2021-08-16 19:19:13
这个 Go 程序说文件不存在也不存在有什么原因吗?大概是其中之一吧?package mainimport (    "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)        }    }}
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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 的目的是创建一个文件,所以文件丢失永远不会出错。


查看完整回答
反对 回复 2021-08-16
?
绝地无双

TA贡献1946条经验 获得超4个赞

如果文件存在,某些功能将失败。这种系统调用返回的错误将满足os.IsExist(). 一个这样的系统调用是os.OpenFile()带有标志O_CREATO_EXCL。如果文件不存在,其他函数会失败,比如os.OpenFile没有O_CREAT标志。这种系统调用返回的错误将满足os.IsNotExist(). 该nil错误既不满足os.IsExist(),并os.IsNotExist()因为它不是一个失败的情况。

在您的示例中,os.Stat()如果您尝试统计的文件不存在,则该函数可能会失败。如果文件存在,它也可能失败,但不是因为文件存在的原因。因此,os.IsExist(e)将始终falseos.Stat()函数产生的错误让步。


查看完整回答
反对 回复 2021-08-16
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

检查文件是否存在的最佳方法(其中 src = 文件路径):


if _, err := os.Stat(src); err == nil || os.IsExist(err) {

    // your code here if file exists

}


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 305 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信