Go语言中如何区分EISDIR错误与其他文件操作错误?
判断OpenFile返回的EISDIR错误(目标路径为目录)
你可以通过标准库的两种原生方案便捷判断该错误,无需额外依赖:
方案1:用errors.As提取路径错误并检查
这种方式更严谨,适合需要明确错误类型的场景:
import ( "errors" "os" "syscall" ) // ... fh, err := os.OpenFile(viper.GetString("output"), os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0700) if err != nil { var pathErr *os.PathError if errors.As(err, &pathErr) && pathErr.Err == syscall.EISDIR { // 目标路径是目录,执行写入目录内文件的逻辑 // 注:你提到的竞态风险仍存在,目录状态可能在检查后被修改 } else { // 其他错误(如文件已存在),直接返回 return err } } else { // 写入文件逻辑 defer fh.Close() // ... }
方案2:直接用errors.Is匹配系统错误值
Go 1.13及以上版本支持直接匹配底层系统错误:
import ( "errors" "os" "syscall" ) // ... fh, err := os.OpenFile(viper.GetString("output"), os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0700) if err != nil { if errors.Is(err, syscall.EISDIR) { // 目标路径是目录,执行对应逻辑 } else { return err } } else { // 写入文件逻辑 defer fh.Close() // ... }
补充说明
两种方法都是标准库原生实现,无需额外引入第三方包;你提到的竞态问题确实无法通过简单错误判断规避,若需要彻底解决,可能需要借助文件锁或原子操作,但会增加逻辑复杂度,需根据场景必要性选择。
内容的提问来源于stack exchange,提问作者Nic Gibson
相关产品推荐
相关产品推荐

