如何检查ioutil.ReadFile返回的特定错误类型?

Jer*_*ain 6 go

当我ioutil用来读取文件时,它可能会返回错误.但是,如果我想过滤一些错误代码,我该怎么办?

res, err := ioutil.ReadFile("xxx")
if err != nil {
    fmt.Println(err.Error())  
}
...
Run Code Online (Sandbox Code Playgroud)

在上面的代码段中,当文件没有权限时,fmt.Println(err.Error())将打印"open xxxxx: permission denied.如果我想捕获此类错误,我怎么知道文件读取失败,因为权限被拒绝?

我应该搜索err.Error()字符串permission denied- 这看起来很不合适.有没有更好的方法?

提前致谢.

更新

在尝试了@Intermernet解决方案之后,我发现它不会命中case os.ErrPermission,它会命中default并打印"open xxx: Permission denied".

@Aedolon解决方案没问题,os.IsPermission(err)可以通过权限拒绝判断文件是否失败.

Lem*_*eId 8

根据当前的API,ioutil.ReadFile不保证任何特定的行为,除了它将err == nil在成功时返回.即使是syscall包实际上也不能保证特定的错误.

当前的ioutil.ReadFile使用实现os.Open,将*os.PathError在未能打开文件时返回,不会os.ErrPermission或其他任何内容.os.PathError包含一个Err也是错误的字段- 在这种情况下,a syscall.Errno.字符串"permission denied"是从私有的错误消息表中生成的,它既是体系结构,也是特定于实现的.在我的Windows机器中,它说"访问被拒绝".

AFAIK,正确的方法是使用os.IsPermission(err),true在缺少权限的情况下将返回.