Go语言中调用os.Chdir()提示permission denied问题求助
问题分析与解决
问题原因
你给新目录设置了0777权限,但实际生效的权限会被umask(权限掩码)过滤——默认umask通常是0022,会把0777转成0755(所有者读写执行,组和其他读执行)。但核心问题是你运行程序时所在的父目录权限不足:目录的执行权限对应“进入”权限,如果父目录没给你执行权限,哪怕创建了子目录,也没法切换进去。
另外,要注意os.Mkdir的第二个参数是八进制数,你写0777的语法是对的,但父目录的权限限制才是导致报错的关键。
解决方案
先排查父目录权限
在终端执行ls -ld .查看当前程序运行目录的权限:- 如果权限是
drw-r--r--(0644),说明没有执行权限,直接执行chmod +x .给当前目录加执行权限即可。 - 如果是
drwxr-xr-x(0755),那权限没问题,再往下排查。
- 如果权限是
改用绝对路径创建并切换目录
相对路径可能会因为当前工作目录的权限或位置问题出故障,改用绝对路径更稳妥: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) }Windows系统额外排查
如果是在Windows下运行,需要右键目标父文件夹→属性→安全,确认当前用户拥有“读取和执行”“列出文件夹内容”权限。
额外提醒
- 别再用
0777权限,这会让所有用户都能任意修改目录里的内容,严重不安全,推荐用0755(仅所有者可修改)或0700(仅自己能操作)。
内容的提问来源于stack exchange,提问作者John Harrington
相关产品推荐
相关产品推荐

