文件在 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_CREATO_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 中既存在又不存在?的主要内容,如果未能解决你的问题,请参考以下文章

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

(Go)13.判断文件或者目录是否存在

golang go中存在检查文件

Go调用mongodb 更新数据不存在插入,存在就更新

[Go] 写文件和判断文件是否存在

go程序执行顺序