Go中存在但不存在的文件?

时间:2014-09-19 17:44:51

标签: file 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)
        }
    }
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果文件存在,某些功能会失败。此类系统调用返回的错误将满足os.IsExist()。一个这样的系统调用是os.OpenFile(),标记为O_CREATO_EXCL。如果文件不存在,则其他函数会失败,例如os.OpenFile没有O_CREAT标志。此类系统调用返回的错误将满足os.IsNotExist()nil错误既不满足os.IsExist()也不满足os.IsNotExist(),因为它不是失败条件。

在您的示例中,如果您尝试stat的文件不存在,os.Stat()函数可能会失败。如果文件存在,它也可能失败,但不是因为文件存在的原因。因此,对于os.IsExist(e)函数产生的错误,false总是会产生os.Stat()

答案 2 :(得分:0)

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

if _, err := os.Stat(src); err == nil || os.IsExist(err) {
    // your code here if file exists
}