go - 从 PathError 中获取 errno 值的正确方法
问题描述
我正在尝试确定 an 是否os.PathError
是由于 anEINVAL
或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
指向常规文件而不是符号链接,则 readlink 应该产生EINVAL
,但我的err.Err == os.ErrInvalid
检查失败并记录以下内容:
2019/03/28 12:04:42 ResolveLinks error: readlink foo: invalid argument
我应该解压 PathError,但接下来呢?比较错误字符串?
我注意到 os 模块具有某些功能来匹配错误类型,例如os.IsNotExist
,但我没有看到所有可能的错误代码。
解决方案
err.Err
is 类型,这syscall.Errno
是可以转换为 int 的整数类型。在 Ubuntu 上运行此代码会产生错误代码 22:
if serr, ok := err.Err.(syscall.Errno); ok {
fmt.Println(int(serr))
}
请记住,我不知道这种检查是否是跨平台的。
如果您只想检查文件是符号链接,您可以使用Lstat获取FileInfo
结构并进行检查:
fi.Mode() & os.ModeSymlink != 0
推荐阅读
- r - 数据框修改客户重复出现次数
- java - 我的代码正在读取行中的最后一个变量和下一行(在文本文件中)中的第一个变量作为单个元素?
- php - Gmail 在 html 电子邮件中去除等号 (=)
- algorithm - 所有子数组的异或之和
- python - 如何让 VLC 关闭它的预取错误?
- javascript - 无法在 javascript 中读取 null 的属性“值”
- python-3.x - 按类型重载函数
- javascript - 基于字符串变量访问嵌套的 javascript 对象
- ruby - 如何使用 Ruby 将 8 字节数组转换为 Int64/long
- mysql - 如何找到用户的国家排名和世界排名?