Go语言通过archive/tar和archive/zip实现打包与解压,tar保留元信息适用于Linux备份,zip跨平台支持好适合分发,可结合gzip压缩,处理大文件需注意流式操作。

Go语言标准库中的 archive/tar 和 archive/zip 包提供了对 tar 和 zip 格式文件的打包与解包支持。下面分别介绍如何使用它们实现常见的压缩与解压操作。
tar 打包与解包
tar 是 Unix 系统中常用的归档格式,不压缩但能保留目录结构和文件元信息(如权限、时间戳)。
1. tar 打包(归档)
将多个文件或目录归档为一个 .tar 文件:
package mainimport ( "archive/tar" "os" "path/filepath")func tarFiles(srcDir, tarFile string) error { f, err := os.Create(tarFile) if err != nil { return err } defer f.Close() tw := tar.NewWriter(f) defer tw.Close() return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } header, err := tar.FileInfoHeader(info, "") if err != nil { return err } // 修正 header 中的 Name,使用相对路径 relPath, _ := filepath.Rel(srcDir, path) header.Name = filepath.ToSlash(relPath) if !info.IsDir() { tw.WriteHeader(header) data, _ := os.Open(path) defer data.Close() io.Copy(tw, data) } else { tw.WriteHeader(header) } return nil })}
2. tar 解包(提取)
从 .tar 文件中提取内容:
立即学习“go语言免费学习笔记(深入)”;
func untar(tarFile, dest string) error { f, err := os.Open(tarFile) if err != nil { return err } defer f.Close() tr := tar.NewReader(f) for { header, err := tr.Next() if err == io.EOF { break } if err != nil { return err } target := filepath.Join(dest, header.Name) switch header.Typeflag { case tar.TypeDir: os.MkdirAll(target, 0755) case tar.TypeReg: os.MkdirAll(filepath.Dir(target), 0755) outFile, _ := os.Create(target) io.Copy(outFile, tr) outFile.Close() } } return nil}
zip 打包与解包
zip 是跨平台常用的压缩归档格式,支持压缩和目录结构。
1. zip 打包(压缩)
将文件夹压缩为 .zip 文件:
import ( "archive/zip" "io" "path/filepath")func zipFiles(srcDir, zipFile string) error { f, err := os.Create(zipFile) if err != nil { return err } defer f.Close() zw := zip.NewWriter(f) defer zw.Close() return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } relPath := filepath.ToSlash(filepath.Rel(srcDir, path)) if info.IsDir() { _, err := zw.Create(relPath + "/") return err } writer, err := zw.Create(relPath) if err != nil { return err } file, _ := os.Open(path) defer file.Close() io.Copy(writer, file) return nil })}
2. zip 解包(解压)
从 .zip 文件中提取内容:
func unzip(zipFile, dest string) error { r, err := zip.OpenReader(zipFile) if err != nil { return err } defer r.Close() for _, file := range r.File { filePath := filepath.Join(dest, file.Name) if file.FileInfo().IsDir() { os.MkdirAll(filePath, 0755) continue } if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil { return err } f, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode()) if err != nil { return err } rc, _ := file.Open() io.Copy(f, rc) f.Close() rc.Close() } return nil}
使用建议
tar 适合保留文件权限和时间戳,常用于 Linux 环境下的备份。 zip 更适合跨平台分发,Windows 原生支持好。 如需压缩,可结合 compress/gzip 使用 tar.gz(即 tar + gzip 压缩)。 处理大文件时注意流式读写,避免内存溢出。基本上就这些。Go 的 archive 包设计简洁,配合 os 和 filepath 使用非常方便。
以上就是Golang的archive打包解包 tar/zip实现的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1399176.html
微信扫一扫
支付宝扫一扫