英文:
File both exists and not exists in 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("存在: %s", src)
}
if _, e := os.Stat(src); os.IsNotExist(e) {
log.Fatalf("不存在: %s", src)
}
}
}
英文:
Is there some reason why this Go program says neither that a file exists nor doesn't exist? Presumably it's one or the other?
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
得分: 4
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的目的是创建一个文件,所以文件缺失从不是一个错误。
英文:
The os.IsExist and os.IsNotExist functions do not test opposite conditions, even though the names seem to imply that they do.
The function os.IsExist returns true when an operation fails because a file already exists. The function os.IsNotExist returns true when the operation fails because the file does not exist.
The function os.Stat always returns an error with os.IsExist(err) == false. The os.Stat function never fails because the file exists.
The function os.OpenFile with O_CREAT always returns an error os.IsNotExist(err) == false. Because the purpose of os.OpenFile with O_CREAT is to create a file, it is never an error for the file to be missing.
答案2
得分: 2
一些函数在文件存在时会失败。这样的系统调用返回的错误会满足os.IsExist()
。其中一个这样的系统调用是带有O_CREAT
和O_EXCL
标志的os.OpenFile()
。其他一些函数在文件不存在时会失败,比如没有O_CREAT
标志的os.OpenFile
。这样的系统调用返回的错误会满足os.IsNotExist()
。nil
错误既不满足os.IsExist()
也不满足os.IsNotExist()
,因为它不是一个失败的条件。
在你的例子中,如果你尝试对一个不存在的文件进行状态查询,os.Stat()
函数可能会失败。它也可能会失败,即使文件存在,但失败的原因不是文件存在。因此,对于os.Stat()
函数产生的错误,os.IsExist(e)
总是返回false
。
英文:
Some functions fail if a file exists. The error returned by such a system call would satisfy os.IsExist()
. One such system call is os.OpenFile()
with flags O_CREAT
and O_EXCL
. Other functions fail if a file does not exist, like os.OpenFile
without the O_CREAT
flag. The error returned by such a system call would satisfy os.IsNotExist()
. The nil
error satisfies neither os.IsExist()
and os.IsNotExist()
as it is not a failure condition.
In your example, the os.Stat()
function could fail if the file you try to stat does not exist. It could also fail if the file existed, but not for the reason of the file existing. Therefore, os.IsExist(e)
will always yield false
for an error produced by the os.Stat()
function.
答案3
得分: 1
检查文件是否存在的最佳方法(其中src为文件路径):
if _, err := os.Stat(src); err == nil || os.IsExist(err) {
// 如果文件存在,在这里编写你的代码
}
请注意,这是Go语言的代码示例。
英文:
Best way to check if file exists (where src = path to file):
if _, err := os.Stat(src); err == nil || os.IsExist(err) {
// your code here if file exists
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论