golang使用archive/zip包可实现文件压缩操作,具体步骤如下:1. 创建zip文件并初始化*zip.writer对象;2. 打开源文件并在zip中创建对应文件头;3. 将源文件内容复制到zip文件中;4. 递归遍历目录结构时,构造相对路径并逐个处理文件;5. 注意事项包括手动设置权限、流式处理大文件、解决中文文件名乱码及关闭资源。通过上述流程即可完成稳定可靠的zip压缩逻辑。

有时候我们需要在程序中对文件或目录进行压缩操作,比如打包日志、上传附件时做压缩处理等。Golang 提供了标准库 archive/zip,可以非常方便地实现 ZIP 格式的压缩和解压。

下面我们就来看看如何用 Golang 的 archive/zip 包来完成文件压缩操作,包括创建 ZIP 文件、添加文件以及处理目录结构等内容。

要使用 archive/zip 压缩文件,首先需要创建一个 ZIP 文件,并初始化一个 *zip.Writer 对象。然后通过这个对象将多个文件逐个写入到 ZIP 中。
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"archive/zip"
"os"
)
func main() {
// 创建一个 zip 文件
zipFile, err := os.Create("output.zip")
if err != nil {
panic(err)
}
defer zipFile.Close()
// 初始化 zip writer
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
// 后续向 zipWriter 添加文件...
}这是基本的结构,之后就可以往这个 ZIP 文件里添加文件了。

要添加一个文件到 ZIP 包中,需要先打开源文件,然后在 ZIP 中创建一个对应的“文件头”,再将内容复制进去。
// 打开源文件
srcFile, err := os.Open("test.txt")
if err != nil {
panic(err)
}
defer srcFile.Close()
// 在 ZIP 中创建一个新文件
fileInZip, err := zipWriter.Create("test.txt")
if err != nil {
panic(err)
}
// 复制内容到 ZIP 文件中
if _, err := io.Copy(fileInZip, srcFile); err != nil {
panic(err)
}这段代码会把当前目录下的 test.txt 添加到 ZIP 包中,名字还是 test.txt。注意这里没有处理路径的问题,如果是目录结构,还需要进一步处理。
如果想压缩一个完整的目录,就需要递归遍历目录中的所有文件和子目录。这一步稍微复杂一点,但逻辑也很清晰:
关键点在于构造 ZIP 内部的路径,避免出现绝对路径或错误的层级结构。
你可以这样开始:
filepath.Walk("mydir", func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
// 构造 ZIP 中的相对路径
relPath, _ := filepath.Rel("mydir", path)
// 打开原文件
srcFile, _ := os.Open(path)
defer srcFile.Close()
// 创建 ZIP 中的新文件
fileInZip, _ := zipWriter.Create(relPath)
// 拷贝内容
io.Copy(fileInZip, srcFile)
return nil
})这样就能把整个目录的内容都压缩进 ZIP 文件中,并保持原有结构。
在实际使用过程中,有几点容易出错或者需要注意的地方:
文件权限:ZIP 文件中的权限信息不会自动保留,如需保留,可能需要手动设置 FileHeader 的 Mode()。
大文件处理:如果压缩的文件很大,建议使用流式处理,不要一次性读取到内存中。
中文文件名乱码:默认情况下,Windows 解压可能会出现中文乱码,可以在创建文件头时使用 utf-8 编码解决:
header := &zip.FileHeader{Name: "中文文件.txt", Method: zip.Store}
header.SetModTime(time.Now())
writer, _ := zipWriter.CreateHeader(header)关闭资源:记得在最后调用 zipWriter.Close() 和 zipFile.Close(),否则可能导致数据未完全写入。
基本上就这些。用 Golang 实现 ZIP 压缩并不复杂,但在处理目录结构和编码细节上稍需注意。只要理清流程,就能写出稳定可靠的压缩逻辑。
以上就是如何用Golang实现文件压缩 使用archive/zip处理压缩文件的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号