Go语言通过archive/zip和compress/gzip包实现文件压缩解压:1. 使用zip包可打包多个文件或目录,支持创建和读取ZIP归档;2. gzip适用于单个文件高压缩比场景,采用流式处理避免内存溢出;3. 建议根据多文件归档或单文件压缩需求选择合适格式,并注意路径安全与大文件处理。

Go语言通过标准库提供了强大的文件压缩与解压支持,主要使用 archive/zip 和 compress/gzip 包来处理常见的压缩格式。下面分别介绍如何实现 zip 和 gzip 格式的压缩与解压。
1. ZIP 压缩与解压
ZIP 是最常用的归档格式之一,适合打包多个文件或目录。
压缩文件为ZIP
将一个或多个文件打包成 zip 文件:
立即学习“go语言免费学习笔记(深入)”;
package mainimport ( "archive/zip" "io" "os")func compressToZip(source, zipFile string) error { file, err := os.Create(zipFile) if err != nil { return err } defer file.Close() zipWriter := zip.NewWriter(file) defer zipWriter.Close() srcFile, err := os.Open(source) if err != nil { return err } defer srcFile.Close() info, err := srcFile.Stat() if err != nil { return err } header, err := zip.FileInfoHeader(info) if err != nil { return err } header.Name = source // 保留原始文件名 writer, err := zipWriter.CreateHeader(header) if err != nil { return err } _, err = io.Copy(writer, srcFile) return err}
解压ZIP文件
Otter.ai
一个自动的会议记录和笔记工具,会议内容生成和实时转录
91 查看详情
读取 zip 文件并提取其中的内容:
package mainimport ( "archive/zip" "io" "os")func extractZip(zipFile, targetDir string) error { reader, err := zip.OpenReader(zipFile) if err != nil { return err } defer reader.Close() for _, file := range reader.File { filePath := targetDir + "/" + file.Name if file.FileInfo().IsDir() { os.MkdirAll(filePath, os.ModePerm) continue } if err := os.MkdirAll(targetDir, os.ModePerm); err != nil { return err } destFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode()) if err != nil { return err } srcFile, err := file.Open() if err != nil { destFile.Close() return err } _, err = io.Copy(destFile, srcFile) destFile.Close() srcFile.Close() if err != nil { return err } } return nil}
2. GZIP 压缩与解压
GZIP 通常用于单个文件的压缩,不支持多文件归档(不像 zip),但压缩率高、速度快。
使用GZIP压缩文件
package mainimport ( "compress/gzip" "io" "os")func compressWithGzip(source, gzipFile string) error { src, err := os.Open(source) if err != nil { return err } defer src.Close() dst, err := os.Create(gzipFile) if err != nil { return err } defer dst.Close() gzWriter := gzip.NewWriter(dst) defer gzWriter.Close() _, err = io.Copy(gzWriter, src) return err}
解压GZIP文件
package mainimport ( "compress/gzip" "io" "os")func decompressGzip(gzipFile, targetFile string) error { src, err := os.Open(gzipFile) if err != nil { return err } defer src.Close() gzReader, err := gzip.NewReader(src) if err != nil { return err } defer gzReader.Close() dst, err := os.Create(targetFile) if err != nil { return err } defer dst.Close() _, err = io.Copy(dst, gzReader) return err}
3. 使用建议
如果需要打包多个文件或目录,优先使用 zip。若只压缩单个大文件以节省空间(如日志),gzip 更合适。注意路径安全:解压时防止路径穿越攻击(例如 ../../../etc/passwd)。大文件处理建议使用流式操作,避免内存溢出。
基本上就这些。Go 的标准库已经足够应对大多数压缩需求,无需引入第三方包。
以上就是Golang如何实现文件压缩与解压的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1114856.html
微信扫一扫
支付宝扫一扫