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

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

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

创建 ZIP 文件并写入内容
要使用 archive/zip 压缩文件,首先需要创建一个 ZIP 文件,并初始化一个 *zip.Writer 对象。然后通过这个对象将多个文件逐个写入到 ZIP 中。
立即学习“go语言免费学习笔记(深入)”;
package mainimport ( "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 包中,需要先打开源文件,然后在 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注意保留原始路径结构(相对于根目录)
关键点在于构造 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处理压缩文件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1395373.html
微信扫一扫
支付宝扫一扫