新闻中心
Golang 文件压缩解压怎么做_Golang zip 与 tar 文件处理实战
Golang标准库支持zip和tar压缩解压。使用archive/zip可实现目录递归压缩与解压,需设置文件头及压缩方法;通过archive/tar结合gzip可创建和解压tar.gz文件,注意路径处理与目录创建。

在 Golang 中处理压缩文件是很多实际项目中常见的需求,比如日志归档、配置打包或文件传输。Golang 标准库提供了对 zip 和 tar 格式的支持,无需引入第三方依赖即可实现文件的压缩与解压。下面通过实战示例,带你掌握如何用 Go 实现 zip 与 tar 的压缩和解压操作。
zip 文件压缩与解压
zip 是跨平台最常用的压缩格式之一,Go 的 archive/zip 包支持读写 zip 文件。
压缩目录为 zip 文件
以下函数将指定目录递归压缩成一个 zip 文件:
func zipDir(source, target string) error {
zipfile, err := os.Create(target)
if err != nil {
return err
}
defer zipfile.Close()
archive := zip.NewWriter(zipfile)
defer archive.Close()
filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, _ := zip.FileInfoHeader(info)
header.Name = strings.TrimPrefix(strings.Replace(path, source, "", -1), string(filepath.Separator))
if info.IsDir() {
header.Name += "/"
} else {
header.Method = zip.Deflate
}
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
}
return err
})
return nil
}
解压 zip 文件到目标目录
下面代码将 zip 文件解压到指定路径:
func unzip(source, target string) error {
reader, err := zip.OpenReader(source)
if err != nil {
return err
}
defer reader.Close()
for _, file := range reader.File {
filePath := filepath.Join(target, file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(filePath, os.ModePerm)
} else {
if err = os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
return err
}
inFile, err := file.Open()
if err != nil {
return err
}
outFile, err := os.Create(filePath)
if err !=
nil {
inFile.Close()
return err
}
_, err = io.Copy(outFile, inFile)
outFile.Close()
inFile.Close()
if err != nil {
return err
}
}
}
return nil
}
tar 文件压缩与解压
tar 常用于 Linux 系统打包,通常配合 gzip 使用(.tar.gz)。Go 提供了 archive/tar 包进行处理。
创建 .tar.gz 压缩包
CA.LA
第一款时尚产品在线设计平台,服装设计系统
94
查看详情
将目录压缩为 tar.gz 文件:
func tarGz(source, target string) error {
outfile, err := os.Create(target)
if err != nil {
return err
}
defer outfile.Close()
gzWriter := gzip.NewWriter(outfile)
defer gzWriter.Close()
tarWriter := tar.NewWriter(gzWriter)
defer tarWriter.Close()
filepath.Walk(source, 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 = strings.TrimPrefix(strings.Replace(path, source, "", -1), string(filepath.Separator))
if err := tarWriter.WriteHeader(header); err != nil {
return err
}
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(tarWriter, file)
}
return err
})
return nil
}
解压 .tar.gz 文件
从 tar.gz 解压所有内容到目标目录:
func untarGz(source, target string) error {
file, err := os.Open(source)
if err != nil {
return err
}
defer file.Close()
gzReader, err := gzip.NewReader(file)
if err != nil {
return err
}
defer gzReader.Close()
tarReader := tar.NewReader(gzReader)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
filePath := filepath.Join(target, header.Name)
switch header.Typeflag {
case tar.TypeDir:
if _, err := os.Stat(filePath); err != nil {
os.MkdirAll(filePath, os.ModePerm)
}
case tar.TypeReg:
dir := filepath.Dir(filePath)
os.MkdirAll(dir, os.ModePerm)
out, err := os.Create(filePath)
if err != nil {
return err
}
_, err = io.Copy(out, tarReader)
out.Close()
if err != nil {
return err
}
}
}
return nil
}
使用建议与注意事项
处理压缩文件时,有几个关键点需要注意:
- 路径拼接使用 filepath.Join 避免跨平台问题
- 遍历目录时注意排除特殊文件(如 .DS_Store、符号链接等)
- 写入文件前确保父目录存在,避免报错
- 及时关闭文件句柄,推荐使用 defer
- tar 不自带压缩,需结合 gzip 才能生成 .tar.gz
对于 zip,文件头需要设置压缩方式(如 Deflate)以减小体积;tar 则直接写入原始数据流。
基本上就这些。Golang 对 zip 和 tar 的支持足够应对大多数场景,只要理解其基于流的处理逻辑,就能灵活实现各种打包解包功能。
以上就是Golang 文件压缩解压怎么做_Golang zip 与 tar 文件处理实战的详细内容,更多请关注其它相关文章!
# 句柄
# 德江seo网站优化价格
# 网站建设的五个过程
# 低价刷粉网站推广快手
# 附海网络推广营销公司
# 湖父镇seo推广
# 微信营销推广手段
# 咸阳网站建设推广优化
# 崇明区营销推广中心电话
# ping对seo的影响
# 上海网站建设信息网
# 遍历
# 如何在
# linux
# 就能
# 压缩文件
# 如何实现
# 压缩解压
# 怎么做
# 递归
# 标准库
# 文件压缩
# 解压
# switch
# golang
# go
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
将HTML动态表格多行数据保存到Google Sheet的教程
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
b站赚钱渠道_b站收益来源
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
C++指针和引用有什么区别_C++内存管理核心概念深度解析
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
顺丰国际快递查询 国际件官方查询入口
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
解决Django多数据库/多Schema环境下外键迁移问题
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
C#中解析不规范的HTML为XML 常见的坑与解决办法
Mac怎么使用表情符号_Mac Emoji快捷键面板
蛙漫安全无毒 官方认证的绿色入口
uc浏览器网页版入口 uc浏览器网页版最新网址
Go RPC HTTP服务正确实现与常见陷阱解析
知音漫客正版漫画平台_知音漫客官网账号登录
J*aScript教程:根据元素文本内容动态设置背景色
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
4399免费游戏网址入口 4399小游戏免费入口点开即玩
Discord Slash 命令响应超时问题的异步解决方案
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
React/Next.js中实现列表项的动态选择与移动
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
抖音极速版最新版本 抖音极速版官方下载地址
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
yandex入口引擎手机版 yandex安卓版下载入口
从OpenAI API响应中高效提取生成文本


2025-11-20
浏览次数:次
返回列表
nil {
inFile.Close()
return err
}
_, err = io.Copy(outFile, inFile)
outFile.Close()
inFile.Close()
if err != nil {
return err
}
}
}
return nil
}