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)
    }
}

关键点:

  1. 目录名必须以/结尾
  2. 使用CreateHeader而不是Create
  3. 设置正确的文件模式:os.ModeDir | 0755
  4. 使用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文件将包含正确的空目录结构。

回到顶部