当前位置:首页 > Go > 正文

Go语言压缩目录实战指南(使用archive/zip包递归打包整个文件夹)

在日常开发中,我们经常需要将一个完整的目录结构打包成 ZIP 文件。Go 语言标准库中的 archive/zip 包提供了强大的压缩功能,支持创建和读取 ZIP 文件。本教程将手把手教你如何使用 Go 的 archive/zip 包来压缩整个目录,包括子目录和所有文件。

Go语言压缩目录实战指南(使用archive/zip包递归打包整个文件夹) Go语言压缩目录  archive/zip教程 Go zip包使用 Go递归压缩文件夹 第1张

准备工作

确保你已安装 Go(建议 1.16 或更高版本)。我们不需要额外的第三方库,仅使用标准库即可完成任务。

核心思路

要压缩一个目录,我们需要:

  1. 遍历目标目录及其所有子目录(使用 filepath.Walk
  2. 对每个文件,将其添加到 ZIP 文件中
  3. 保留原始目录结构(即文件在 ZIP 中的路径应与源路径一致)

完整代码示例

下面是一个完整的 Go 程序,实现将指定目录压缩为 ZIP 文件:

package mainimport (	"archive/zip"	"fmt"	"io"	"os"	"path/filepath")// compressDir 将 srcDir 目录压缩为 dstZipFilefunc compressDir(srcDir, dstZipFile string) error {	// 创建目标 ZIP 文件	zipFile, err := os.Create(dstZipFile)	if err != nil {		return fmt.Errorf("无法创建 ZIP 文件: %v", err)	}	defer zipFile.Close()	// 创建 zip.Writer	zipWriter := zip.NewWriter(zipFile)	defer zipWriter.Close()	// 使用 filepath.Walk 遍历目录	return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {		if err != nil {			return err		}		// 计算文件在 ZIP 中的相对路径		hdrPath, err := filepath.Rel(filepath.Dir(srcDir), path)		if err != nil {			return err		}		// 如果是目录,添加目录条目(以 / 结尾)		if info.IsDir() {			hdrPath += "/"			_, err := zipWriter.Create(hdrPath)			return err		}		// 打开源文件		file, err := os.Open(path)		if err != nil {			return err		}		defer file.Close()		// 在 ZIP 中创建文件头		hdr, err := zip.FileInfoHeader(info)		if err != nil {			return err		}		hdr.Name = hdrPath		// 创建写入器		writer, err := zipWriter.CreateHeader(hdr)		if err != nil {			return err		}		// 复制文件内容到 ZIP		_, err = io.Copy(writer, file)		return err	})}func main() {	// 示例:将 ./myfolder 压缩为 output.zip	err := compressDir("./myfolder", "output.zip")	if err != nil {		fmt.Printf("压缩失败: %v\n", err)		os.Exit(1)	}	fmt.Println("目录压缩成功!")}

代码详解

  • 创建 ZIP 文件:使用 os.Create 创建目标 ZIP 文件。
  • 初始化 zip.Writer:通过 zip.NewWriter 创建写入器,用于向 ZIP 添加内容。
  • 遍历目录:使用 filepath.Walk 递归访问目录中的每个文件和子目录。
  • 处理目录项:对于目录,我们在 ZIP 中创建一个以 / 结尾的条目,以保留目录结构。
  • 处理文件:打开每个文件,读取内容,并通过 io.Copy 写入 ZIP。

注意事项

- 确保源目录存在且可读。
- 目标 ZIP 文件路径不能与源目录重叠,否则可能造成死循环或数据损坏。
- 此方法适用于中小型目录;对于超大目录,可考虑分块处理以节省内存。

总结

通过本教程,你已经掌握了如何使用 Go 语言的 archive/zip 包来压缩整个目录。这项技能在日志归档、备份、文件传输等场景中非常实用。记住关键点:使用 filepath.Walk 递归遍历,正确设置 ZIP 条目的路径,并妥善处理文件和目录的区别。

现在你可以轻松地在你的 Go 项目中集成目录压缩功能了!如果你正在学习 Go语言压缩目录archive/zip教程Go zip包使用Go递归压缩文件夹,希望这篇教程对你有所帮助。