You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:04:56