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

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

最佳答案

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。因为带有 O_CREAT 的 os.OpenFile 的目的是创建文件,所以文件丢失绝不是错误。

关于文件在 Go 中既存在又不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25939584/

相关文章:

linux - 具有多个参数的 Gnu Parallel - 选择性命令执行

java - 如何在 Java 中获取具有最新 lastModified 日期的文件?

c# - 关闭文件时删除

linux - 在 Linux 上,access() 是否比 stat() 快?

mysql - Golang db.Query with sql join

Java 非常基本的加密文件

go - 单元测试时如何包含go模板

go - 如何使用 reflect.DeepEqual() 将指针的值与其类型的零值进行比较?

go - 为什么命令 "go clean -n -r -i github.com/ethereum/go-ethereum..."不起作用?

go - const复合文字去吗?