Go语言通过archive/zip和compress/gzip包实现文件压缩解压,支持ZIP多文件打包与GZIP单文件压缩,结合合理项目结构可构建高效工具。

在Go语言开发中,处理文件的压缩与解压是常见的需求,比如日志归档、数据备份或文件传输优化。Golang标准库提供了强大的支持,尤其是 archive/zip 和 compress/gzip 包,可以轻松实现 zip 和 gzip 格式的压缩与解压功能。下面是一个完整的项目结构设计与核心代码实现,帮助你快速构建一个实用的文件压缩解压工具。
ZIP 是最常用的压缩格式,适用于多个文件打包。Golang 的 archive/zip 包支持读写 ZIP 文件。
压缩多个文件为 ZIP
以下函数将指定路径的多个文件打包成一个 ZIP 文件:
立即学习“go语言免费学习笔记(深入)”;
func CompressToZip(filePaths []string, destZip string) error {
zipfile, err := os.Create(destZip)
if err != nil {
return err
}
defer zipfile.Close()
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">archive := zip.NewWriter(zipfile)
defer archive.Close()
for _, filePath := range filePaths {
err = addToZip(archive, filePath)
if err != nil {
return err
}
}
return nil}
func addToZip(archive *zip.Writer, filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close()
info, err := file.Stat()
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = filepath.Base(filename)
header.Method = zip.Deflate
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
_, err = io.Copy(writer, file)
return err}
解压 ZIP 文件到目标目录
将 ZIP 文件中的内容逐个提取出来:
func DecompressZip(zipPath, destDir string) error {
r, err := zip.OpenReader(zipPath)
if err != nil {
return err
}
defer r.Close()
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for _, file := range r.File {
filePath := filepath.Join(destDir, file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
continue
}
if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
return err
}
outFile, err := os.Create(filePath)
if err != nil {
return err
}
rc, err := file.Open()
if err != nil {
outFile.Close()
return err
}
_, err = io.Copy(outFile, rc)
rc.Close()
outFile.Close()
if err != nil {
return err
}
}
return nil}
GZIP 通常用于单个文件压缩,常用于网络传输或日志压缩。使用 compress/gzip 包即可实现。
GZIP 压缩单个文件
func CompressGzip(srcFile, destGzip string) error {
src, err := os.Open(srcFile)
if err != nil {
return err
}
defer src.Close()
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">dst, err := os.Create(destGzip)
if err != nil {
return err
}
defer dst.Close()
gz := gzip.NewWriter(dst)
defer gz.Close()
_, err = io.Copy(gz, src)
return err}
GZIP 解压文件
func DecompressGzip(srcGzip, destFile string) error {
src, err := os.Open(srcGzip)
if err != nil {
return err
}
defer src.Close()
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">gz, err := gzip.NewReader(src)
if err != nil {
return err
}
defer gz.Close()
dst, err := os.Create(destFile)
if err != nil {
return err
}
defer dst.Close()
_, err = io.Copy(dst, gz)
return err}
为了便于维护和扩展,推荐如下目录结构:
main.go 示例调用:
func main() {
files := []string{"file1.txt", "file2.txt"}
err := compressor.CompressToZip(files, "output.zip")
if err != nil {
log.Fatal(err)
}
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">err = compressor.DecompressZip("output.zip", "./extracted")
if err != nil {
log.Fatal(err)
}}
实际使用中需注意以下几点:
基本上就这些。Golang 的标准库已经足够强大,无需引入第三方依赖即可完成大多数压缩任务。合理封装后,可作为通用模块集成进各类服务中。不复杂但容易忽略的是路径处理和资源释放,务必确保 Close 被正确调用。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号