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

这个 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)

        }

    }

}


料青山看我应如是
浏览 306回答 3
3回答

慕哥9229398

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

绝地无双

如果文件存在,某些功能将失败。这种系统调用返回的错误将满足os.IsExist(). 一个这样的系统调用是os.OpenFile()带有标志O_CREAT和O_EXCL。如果文件不存在,其他函数会失败,比如os.OpenFile没有O_CREAT标志。这种系统调用返回的错误将满足os.IsNotExist(). 该nil错误既不满足os.IsExist(),并os.IsNotExist()因为它不是一个失败的情况。在您的示例中,os.Stat()如果您尝试统计的文件不存在,则该函数可能会失败。如果文件存在,它也可能失败,但不是因为文件存在的原因。因此,os.IsExist(e)将始终false为os.Stat()函数产生的错误让步。

繁花不似锦

检查文件是否存在的最佳方法(其中 src = 文件路径):if _, err := os.Stat(src); err == nil || os.IsExist(err) {    // your code here if file exists}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go