Golang通过archive/zip和compress/gzip包实现文件压缩与解压,zip适用于多文件或目录归档,gzip用于单个文件流式压缩,如HTTP传输或日志归档。

Golang在文件压缩与解压方面,提供了非常成熟且高效的标准库支持,无论是处理单个文件流还是复杂的目录结构归档,你都能找到趁手的工具。核心在于
archive/zip
compress/gzip
我个人在项目里,最常用到的就是
zip
gzip
zip
gzip
先说说
zip
package main
import (
"archive/zip"
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
// CompressFiles 将多个文件或目录压缩成一个 ZIP 归档。
func CompressFiles(outputZipPath string, filesToCompress []string) error {
zipFile, err := os.Create(outputZipPath)
if err != nil {
return fmt.Errorf("创建压缩文件失败: %w", err)
}
defer zipFile.Close()
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close() // 确保关闭 zipWriter 以写入目录信息
for _, fileOrDir := range filesToCompress {
info, err := os.Stat(fileOrDir)
if err != nil {
// 如果文件或目录不存在,我们可能想跳过或者报错,这里选择报错。
return fmt.Errorf("获取文件/目录信息失败 %s: %w", fileOrDir, err)
}
if info.IsDir() {
// 处理目录压缩,需要递归遍历
err = filepath.Walk(fileOrDir, func(path string, d os.FileInfo, err error) error {
if err != nil {
return err
}
// 计算在 ZIP 归档中的相对路径
// 注意:这里需要处理好根目录本身的情况,避免重复添加或路径错误
relPath, err := filepath.Rel(fileOrDir, path)
if err != nil {
return err
}
if relPath == "." { // 根目录本身不作为单独的条目添加
return nil
}
header, err := zip.FileInfoHeader(d)
if err != nil {
return fmt.Errorf("创建文件头失败 %s: %w", path, err)
}
// 转换为斜杠路径,保证跨平台兼容性
header.Name = filepath.ToSlash(relPath)
if d.IsDir() {
header.Name += "/" // 目录名以斜杠结尾
}
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return fmt.Errorf("创建zip条目失败 %s: %w", path, err)
}
if !d.IsDir() {
file, err := os.Open(path)
if err != nil {
return fmt.Errorf("打开文件失败 %s: %w", path, err)
}
// 这里不能使用 defer file.Close(),因为循环会提前关闭
// 应该在每个文件处理完毕后立即关闭
_, err = io.Copy(writer, file)
file.Close() // 及时关闭文件
if err != nil {
return fmt.Errorf("写入文件内容失败 %s: %w", path, err)
}
}
return nil
})
if err != nil {
return fmt.Errorf("遍历目录失败 %s: %w", fileOrDir, err)
}
} else {
// 处理单个文件压缩
header, err := zip.FileInfoHeader(info)
if err != nil {
return fmt.Errorf("创建文件头失败 %s: %w", fileOrDir, err)
}
header.Name = filepath.Base(fileOrDir) // 只保留文件名
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return fmt.Errorf("创建zip条目失败 %s: %w", fileOrDir, err)
}
file, err := os.Open(fileOrDir)
if err != nil {
return fmt.Errorf("打开文件失败 %s: %w", fileOrDir, err)
}
_, err = io.Copy(writer, file)
file.Close() // 及时关闭文件
if err != nil {
return fmt.Errorf("写入文件以上就是Golang文件压缩与解压处理方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号