这个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)
}
}
}
答案 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_CREAT
和O_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
}