Golang中如何通过archive/zip添加空目录
Golang中如何通过archive/zip添加空目录 我尝试添加空目录,但对我无效。 这是一个简单的示例:GitHub上的空目录zip
生成的压缩包是空的。 请帮帮我!
3 回复
我意识到我的问题是什么了——我的归档管理器(Ubuntu 22.04 中的实用工具)在 zip 文件中不显示空目录。但如果我解压归档文件,就能看到空目录。 非常感谢!
更多关于Golang中如何通过archive/zip添加空目录的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好,欢迎。你可以使用简单的 Create 函数,而不是尝试自己构建文件头:
func main() {
f, _ := os.Create("test.zip")
defer f.Close()
w := zip.NewWriter(f)
defer w.Close()
w.Create("empty-folder/")
}
当你解压 test.zip 时,里面将只有 empty-folder 文件夹。如果你想使用 CreateHeader,请使用 func FileInfoHeader(fi fs.FileInfo) (*FileHeader, error) 函数,而不是从头开始自己构建:
func main() {
fi, _ := os.Stat("empty-folder")
header, _ := zip.FileInfoHeader(fi)
header.Method = zip.Store
f, _ := os.Create("test.zip")
defer f.Close()
w := zip.NewWriter(f)
defer w.Close()
w.CreateHeader(header)
}
在Go中,archive/zip包确实需要特殊处理来添加空目录。空目录在ZIP格式中是通过创建一个以/结尾的条目来表示的。以下是正确的实现方法:
package main
import (
"archive/zip"
"bytes"
"io"
"os"
)
func main() {
// 创建内存缓冲区
buf := new(bytes.Buffer)
// 创建zip写入器
w := zip.NewWriter(buf)
// 添加空目录 - 关键是以"/"结尾
dirHeader := &zip.FileHeader{
Name: "empty_dir/", // 注意结尾的斜杠
Method: zip.Store, // 存储模式,不压缩
Modified: time.Now(),
}
dirHeader.SetMode(os.ModeDir | 0755)
_, err := w.CreateHeader(dirHeader)
if err != nil {
panic(err)
}
// 可选:添加一个文件到该目录
fileHeader := &zip.FileHeader{
Name: "empty_dir/file.txt",
Method: zip.Deflate,
Modified: time.Now(),
}
fileHeader.SetMode(0644)
f, err := w.CreateHeader(fileHeader)
if err != nil {
panic(err)
}
f.Write([]byte("File in empty directory"))
// 关闭zip写入器
err = w.Close()
if err != nil {
panic(err)
}
// 将zip写入文件
outputFile, err := os.Create("output.zip")
if err != nil {
panic(err)
}
defer outputFile.Close()
_, err = io.Copy(outputFile, buf)
if err != nil {
panic(err)
}
}
关键点:
- 目录名必须以
/结尾 - 使用
CreateHeader而不是Create - 设置正确的文件模式:
os.ModeDir | 0755 - 使用
zip.Store方法避免压缩空目录
如果你需要创建嵌套的空目录结构:
// 创建嵌套空目录
dirs := []string{
"parent_dir/",
"parent_dir/child_dir/",
"parent_dir/child_dir/grandchild_dir/",
}
for _, dir := range dirs {
dirHeader := &zip.FileHeader{
Name: dir,
Method: zip.Store,
Modified: time.Now(),
}
dirHeader.SetMode(os.ModeDir | 0755)
_, err := w.CreateHeader(dirHeader)
if err != nil {
panic(err)
}
}
这样生成的ZIP文件将包含正确的空目录结构。

