使用Golang创建带有嵌套目录的路径:os.Create

4

如GoDocs所述,os.Create()函数可以在指定路径下创建一个文件。

os.Create("fonts/foo/font.eot")

但当 fontsfoo 不存在时,它会返回 panic: open fonts/foo/font.eot: 系统找不到指定的路径。
所以我使用了os.MkdirAll() 来创建嵌套目录。但是这个函数还有许多其他问题。

path := "fonts/foo/font.eot"
// this line create a directory named (font.eot) !
os.MkdirAll(path, os.ModePerm)

有更好的方法在嵌套目录中创建文件吗?

3
这是执行此类任务的正确方式 - 在系统级别上,这些映射到mkdiropen系统调用。你所指的“许多其他问题”是什么? - oakad
4
这段代码非常简单明了,意思是创建一个名为"fonts/foo"的文件夹,并赋予它0770的权限;同时在该文件夹下创建一个名为"font.eot"的文件。 - Volker
1
@Volker:大多数程序可能应该在此处使用模式0777而不是0770。文件创建通常应使用模式0666。如果需要,这些允许用户的umask去除组和/或其他写权限,甚至更多的权限(导致目录的模式为0750或0700)。(我在其他地方看到过使用0770的建议,但不确定其源头。) - torek
4
@torek,文件路径和模式都不是固定的,需要根据您特定的使用情况进行调整。没有单一正确的值。 - Volker
1个回答

28

标准方式如下:

func create(p string) (*os.File, error) {
    if err := os.MkdirAll(filepath.Dir(p), 0770); err != nil {
        return nil, err
    }
    return os.Create(p)
}

几点说明:

  • 与问题中所述不同,os.Create不会引发panic。
  • 从文件路径的目录部分创建目录,而不是完整的路径。

第二个注释非常重要! - atultw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接