Golang os.使用嵌套目录创建路径

Golang os.使用嵌套目录创建路径,go,operating-system,Go,Operating System,正如GoDocs中提到的,os.Create()在特定路径中创建一个文件 os.Create(“font/foo/font.eot”) 但是当font或foo不存在时,它返回panic:open fonts/foo/font.eot:系统找不到指定的路径。 因此,我使用os.MkdirAll()创建嵌套目录。但是这个函数还有很多其他问题 path:=“font/foo/font.eot” //这一行创建一个名为(font.eot)的目录! os.MkdirAll(路径,os.ModePerm)

正如GoDocs中提到的,
os.Create()
在特定路径中创建一个文件

os.Create(“font/foo/font.eot”)
但是当
font
foo
不存在时,它返回
panic:open fonts/foo/font.eot:系统找不到指定的路径。

因此,我使用
os.MkdirAll()
创建嵌套目录。但是这个函数还有很多其他问题

path:=“font/foo/font.eot”
//这一行创建一个名为(font.eot)的目录!
os.MkdirAll(路径,os.ModePerm)

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

标准方法如下:

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

  • Create不会像问题中所说的那样惊慌失措
  • 从文件路径的目录部分而不是完整路径创建目录

这是做这些事情的正确方法-在系统级别上,这些映射到
mkdir
open
系统调用。你指的是什么“许多其他问题”?它是
os.MkdirAll(“font/foo”,0770);os.Create(“fonts/foo/font.eot”)
非常简单而且非常明显。@沃尔克:大多数程序可能应该在这里使用模式
0777
,而不是
0770
。文件创建通常应使用模式
0666
。这些允许用户的umask根据需要删除组和/或其他写入权限,或者根据需要删除更多权限(导致目录的模式为0750或0700)。(我在其他地方看到过使用0770的建议,但不确定它来自何处。)@torek文件路径和模式都不是固定的,需要根据您的特定用例采用。没有一个正确的值。