如果我这样做
s, err := os.Stat(path)
和err != nil
我需要知道文件是否存在而不是我没有权限访问它,等等。如何获取基础错误代码?阅读os
包文档似乎表明我读了错误字符串的文本 - 当然不是吗?
答案 0 :(得分:5)
Stat返回描述指定文件的
FileInfo
。 如果出现错误,则其类型为*PathError
。
PathError
记录在案on the same page,声明它包含导致错误的操作,导致错误的文件的路径以及底层系统的错误。如果在调用os.Stat
时未找到该文件,则返回的错误将如下所示:
&PathError{"stat", "/your/file", syscall.Errno(2)}
由于底层错误本质上取决于您使用的操作系统,因此您唯一能做的就是
理解PathError.Err
。对于UNIX系统,syscall
包具有syscall.Stat
之类的系统调用返回的Errno
error type。您可以将此值与constants in the syscall
package进行比较,并处理错误(Click to play):
stat, err := os.Stat(file)
if perr, ok := err.(*os.PathError); ok {
switch perr.Err.(syscall.Errno) {
case syscall.ENOENT: fmt.Println("No such file or directory.")
default: panic("Unknown error")
}
}
执行此操作的较短方法是使用os.IsNotExist
pretty much the above
并且,最重要的是,平台无关:
stat, err := os.Stat(file)
if err != nil && os.IsNotExist(err) {
// ...
}
答案 1 :(得分:0)
另一个答案很棒,但我想添加有关此建议的注释:
stat, err := os.Stat(file)
if err != nil && os.IsNotExist(err) {
// ...
}
我发现在很多情况下,我需要根据不同的情况采取不同的行动 每个测试,所以实际上你在这里有三个分支。这是我使用的代码 那个:
stat, err := os.Stat(file)
if os.IsNotExist(err) {
// branch one
} else if err != nil {
// branch two
}
// branch three