os.MkdirAll创建多级嵌套目录失败是否为Go标准库BUG?
问题根因说明
这不是Go标准库os.MkdirAll的BUG,问题出在你传入的权限参数不符合目录的运行要求:
- 类Unix系统中,目录和普通文件的权限逻辑完全不同:要在某一目录下创建子项(子目录/文件),操作用户对该目录必须具备执行权限(x权限位),否则无法遍历进入目录完成写入操作。
- 你传入的权限参数是
0644,对应权限为rw-r--r--,完全没有开放执行权限:- 创建单层目录
output/2021-11-12.19.51.50.047614时,仅需要创建这一级目录,不需要在刚创建的目录下写入内容,所以操作可以成功。 - 创建多级嵌套目录时,
os.MkdirAll会先创建父级目录output/2021-11-12.19.51.50.047614,并将其权限设为你指定的0644,接下来要在该父目录下创建2011-12子目录时,因为父目录没有执行权限,系统会拒绝写入操作,最终导致整个调用失败。
- 创建单层目录
修复方法
将权限参数替换为符合目录要求的权限值即可,常用的目录权限为0755(对应rwxr-xr-x,所有者可读可写可执行,其他用户可读可执行),修改后的调用代码如下:
os.MkdirAll(prefix, 0755)
如果需要更严格的目录权限,至少要保证所有者的执行位开启,比如0700也可以正常完成多级目录创建。
内容的提问来源于stack exchange,提问作者Dean Schulze
相关产品推荐
相关产品推荐

