Golang中如何实现创建文件时同时创建目录

Golang中如何实现创建文件时同时创建目录 我需要通过HTTP POST请求上传文件并将其保存到名为public/file的文件夹中,以下是我的代码:

file, handler, err := r.FormFile("file")
defer file.Close()
if err != nil {
	panic(err)
}

f, err := os.OpenFile("./public/file/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
defer f.Close()
io.Copy(f, file)

如果目录已经存在,这段代码可以正常工作,但我希望当目录不存在时能够自动创建目录。 请问有谁知道该如何实现这个功能吗?


更多关于Golang中如何实现创建文件时同时创建目录的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢,我之前没找到 ;)

更多关于Golang中如何实现创建文件时同时创建目录的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Google 表示 os.MkdirAll 确实存在。

可以使用os.MkdirAll()函数在创建文件前自动创建所需的目录。以下是修改后的代码:

file, handler, err := r.FormFile("file")
if err != nil {
    panic(err)
}
defer file.Close()

// 确保目录存在
dir := "./public/file"
if err := os.MkdirAll(dir, 0755); err != nil {
    panic(err)
}

// 创建文件
filePath := filepath.Join(dir, handler.Filename)
f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
    panic(err)
}
defer f.Close()

io.Copy(f, file)

关键点说明:

  • os.MkdirAll()会递归创建所有不存在的目录,类似于Linux中的mkdir -p命令
  • 使用filepath.Join()来构建文件路径,这样可以正确处理不同操作系统的路径分隔符
  • 建议将文件创建的错误检查移到os.OpenFile()调用之后,而不是在defer语句之前

如果只需要创建单级目录,可以使用os.Mkdir(),但os.MkdirAll()更通用,可以处理多级嵌套目录的创建。

回到顶部