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

Go语言中调用os.Chdir()提示permission denied问题求助

问题分析与解决

问题原因

你给新目录设置了0777权限,但实际生效的权限会被umask(权限掩码)过滤——默认umask通常是0022,会把0777转成0755(所有者读写执行,组和其他读执行)。但核心问题是你运行程序时所在的父目录权限不足:目录的执行权限对应“进入”权限,如果父目录没给你执行权限,哪怕创建了子目录,也没法切换进去。

另外,要注意os.Mkdir的第二个参数是八进制数,你写0777的语法是对的,但父目录的权限限制才是导致报错的关键。

解决方案

  1. 先排查父目录权限
    在终端执行ls -ld .查看当前程序运行目录的权限:

    • 如果权限是drw-r--r--(0644),说明没有执行权限,直接执行chmod +x .给当前目录加执行权限即可。
    • 如果是drwxr-xr-x(0755),那权限没问题,再往下排查。
  2. 改用绝对路径创建并切换目录
    相对路径可能会因为当前工作目录的权限或位置问题出故障,改用绝对路径更稳妥:

    import (
        "log"
        "os"
        "path/filepath"
    )
    
    func main() {
        // 获取当前工作目录的绝对路径
        currentDir, err := os.Getwd()
        if err != nil {
            log.Fatal(err)
        }
        // 拼接目标目录的绝对路径
        targetDir := filepath.Join(currentDir, "English")
        
        // 创建目录,用0755安全权限,同时处理目录已存在的情况
        err = os.Mkdir(targetDir, 0755)
        if err != nil && !os.IsExist(err) {
            log.Fatal(err)
        }
        // 切换到绝对路径的目录
        err = os.Chdir(targetDir)
        if err != nil {
            log.Fatal(err)
        }
        // 验证切换成功
        newDir, _ := os.Getwd()
        log.Println("已切换到目录:", newDir)
    }
    
  3. Windows系统额外排查
    如果是在Windows下运行,需要右键目标父文件夹→属性→安全,确认当前用户拥有“读取和执行”“列出文件夹内容”权限。

额外提醒

  • 别再用0777权限,这会让所有用户都能任意修改目录里的内容,严重不安全,推荐用0755(仅所有者可修改)或0700(仅自己能操作)。

内容的提问来源于stack exchange,提问作者John Harrington

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:10:37