我正在尝试确定 os.PathError
是由 EINVAL
还是 ENOENT
引起的。我如何正确地做出该决定?
res, err := os.Readlink(fpath)
if err, ok := err.(*os.PathError); ok {
if err.Err == os.ErrInvalid {
// This path here. What's the correct check?
return fpath
}
log.Printf("ResolveLinks error: %s", err)
return ""
}
log.Printf("Resolved: %s to %s", fpath, res)
return res
如果 fpath
指向常规文件而不是符号链接(symbolic link),readlink 应该生成 EINVAL
,但是我的 err.Err == os.ErrInvalid
检查失败并记录以下内容:
2019/03/28 12:04:42 ResolveLinks 错误:readlink foo:参数无效
我应该解压 PathError,但是然后呢?比较错误字符串?
我注意到 os 模块有一些函数可以匹配错误类型,比如 os.IsNotExist
,但我没有看到所有可能的错误代码。
最佳答案
err.Err
是 syscall.Errno
类型,这是可以转换为 int 的整数类型。在 Ubuntu 上运行此代码会产生错误代码 22:
if serr, ok := err.Err.(syscall.Errno); ok {
fmt.Println(int(serr))
}
请记住,我不知道这种检查是否跨平台。
如果你只是想检查文件是符号链接(symbolic link)你可以使用Lstat获取 FileInfo
结构并进行检查:
fi.Mode() & os.ModeSymlink != 0
关于go - 从 PathError 中获取 errno 值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55405324/