golang 创建多级目录失败

2022-09-17 14:25:11 +08:00
 wtfedc

请教个问题,没搜到类似情况的。

调用 os.Create 或者 os.WriteFile ,文件名是一个绝对路径,调用前 后边几级目录还没创建,按官方的例子,会自动创建目录,实际使用会报错: no such file or directory

调用前加了syscall.Umask(0),对新创建文件的权限,取消了掩码限制

绝对路径类似于 /Users/admin/xxx/blog/content/zh-CN/post/filedir/test

已有目录 /Users/admin/xxx/blog/content/zh-CN/post 的权限也是 3 个 rwx ,自己在 shell 操作创建也是没问题。

因为拼接的路径,后边几级目录不确定,不至于每次创建一级,就调用个 os.Chmod 吧。。。


官方文档 func WriteFile(name string, data []byte, perm FileMode) error

WriteFile writes data to the named file, creating it if necessary. If the file does not exist, WriteFile creates it with permissions perm (before umask); otherwise WriteFile truncates it before writing, without changing permissions.

err := os.WriteFile("testdata/hello", []byte("Hello, Gophers!"), 0666)
if err != nil {
log.Fatal(err)
}
1149 次点击
所在节点    问与答
7 条回复
keepeye
2022-09-17 14:28:46 +08:00
只会自动创建文件吧,目录需要你自己创建或者 os.MkdirAll
wtfedc
2022-09-17 14:34:49 +08:00
@keepeye 下边的代码是官方例子,我也调不通,不确定是不是和 macOS 有关系
wtfedc
2022-09-17 14:40:21 +08:00
@keepeye 在 windows 也跑了一下,同样报错。可能我理解错了,不能使用 WriteFile 创建文件夹。官方给的个例子真的不怎么好,一个跑不通的例子,算了,转身去用 MkdirAll 了
keepeye
2022-09-17 14:41:34 +08:00
官方的例子让你知道不会帮你创建目录,你点下 run 就知道了啊,create file 不是 create dir
keepeye
2022-09-17 14:44:11 +08:00
你再点开 WriteFile 源码,所谓的自动创建文件就是 open 操作的时候使用了 O_CREAT mode

OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm)
keepeye
2022-09-17 14:46:06 +08:00
可以参考下 touch 命令,也会报同样的错误

touch: cannot touch 'a/b.txt': No such file or directory
wtfedc
2022-09-17 14:47:34 +08:00
@keepeye 感谢,了解了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880801

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX