网易首页 > 网易号 > 正文 申请入驻

Go 如何打包与压缩文件

0
分享至

文件的打包、压缩与解压缩是经常会使用到的功能,我们可以通过 tar、gzip 等工具来完成这些操作。在 Go 中,标准库archive与compress为我们提供了这些能力,通过本文示例,你会发现以 Go 编程的方式生成与处理压缩打包文件也非常简单。

打包和压缩

在开始代码之前,我们需要明确打包和压缩的概念。

  • 打包,又被称为归档,指的是一个文件或目录的集合,而这个集合被存储在一个文件中。
  • 压缩,指的是利用算法将文件进行处理,以达到保留最大文件信息,而让文件体积变小的目的。

以打包工具 tar 为例,通过其打出来的文件通常称为 tar 包,其文件命名通常以 .tar 结尾。再通过其他的压缩工具对 tar 包进行压缩,例如 gzip 压缩,则得到通常以 .tar.gz 结尾命名的压缩文件(在 tar 中可使用 -z 参数来调用gzip)。

tar 包是文件的集合,其结构也是由数据段组成的,每块数据段包含了文件头(描述文件的元信息)和文件内容。

archive 库打包与解包

archive 库的中文含义是档案,它的作用就是归档(打包)与拆档(解包)。其提供两种方案:tar 与 zip,调用路径分别为archive/tar和archive/zip。

我们以 tar 为例,来展示如何实现文件的打包与解包。

首先,新建目标打包文件为 out.tar,再构造一些文件数据 readme.txt、gopher.txt 和 todo.txt 用于归档。

接着依次构建文件头信息,分别指定了文件名、权限和大小(可定义更多文件头字段),再通过*tar.Writer类型的 tw 变量,按序调用WriteHeader和Write方法将需要打包的数据段(文件头+文件内容)写入到out.tar文件。

执行以上代码,将得到打包后的 out.tar 文件,可通过 tar 工具指定 -tvf 参数查看归档信息。

可以看到,指定的文件信息(文件名、权限和大小)符合预期,但其他未指定的元信息是有误的,例如日期(直接给的默认值)。

如果通过 tar 工具,我们可以执行以下命令来提取 out.tar 中的文件。

但在程序中实现,应该怎么做呢?

首先需要打开 out.tar,并构造*tar.Reader类型的 tr 变量。之后,利用tr.Next依次提取每个数据段内容,并通过 io.Copy(os.Stdout, tr),将文件内容拷贝至标准输出。直到tr.Next遇到io.EOF,它代表读取到了归档文件末尾,则退出提取。

compress 库压缩与解压缩

compress 库中支持了多种压缩方案,包括 bzip2、flate、gzip、lzw 和 zlib,调用路径为compress/xxx。

我们以常用的 gzip 为例,来展示压缩与解压缩代码。

如果同样是上文中的文件数据 readme.txt、gopher.txt 和 todo.txt,我们想得到 tar 归档且被压缩了的 out.tar.gz 文件,应该如何做呢?

非常简单!只需要将tar.NewWriter(tarFile)改为tar.NewWriter(gz)即可,其中gz是由 gzip.NewWriter(tarFile)而来。

我们比较有压缩与无压缩的归档 tar 包大小,可以看到文件体积从4.0K压缩为了224B。

同理,如果要解压并解包 out.tar.gz 文件,应该如何做呢?

总结

注:文章转自Golang技术分享,侵删

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
华为与江淮汽车打造的“尊界”首次亮相

华为与江淮汽车打造的“尊界”首次亮相

澎湃新闻
2024-11-26 17:43:03
“雷军是我大哥”!何小鹏:当年买了1亿多美元小米股票,“终于赚钱了,很开心”

“雷军是我大哥”!何小鹏:当年买了1亿多美元小米股票,“终于赚钱了,很开心”

每日经济新闻
2024-11-26 17:48:18
终于有人说了实话!羽绒服从业者表示:159元不可能买到90%鹅绒服

终于有人说了实话!羽绒服从业者表示:159元不可能买到90%鹅绒服

看晓天下事
2024-11-26 16:08:54
清朝对中国领土的贡献不可磨灭!没有清朝完成一统,后果不堪设想

清朝对中国领土的贡献不可磨灭!没有清朝完成一统,后果不堪设想

文史道
2024-11-25 06:45:02
倪萍哭诉蔡磊近况,很糟糕,已签署遗体捐赠协议,非常不舍得他

倪萍哭诉蔡磊近况,很糟糕,已签署遗体捐赠协议,非常不舍得他

阿凫爱吐槽
2024-11-26 16:17:10
市监部门回应“一份白粥200元”

市监部门回应“一份白粥200元”

中国新闻周刊
2024-11-25 21:51:03
王金兰举报刀郎剽窃后续!刀郎报警,更多内幕曝光:女方出卖刀郎

王金兰举报刀郎剽窃后续!刀郎报警,更多内幕曝光:女方出卖刀郎

拾娱先生
2024-11-25 23:07:29
深圳将迎来一座“超级大站”,预计2027年竣工......

深圳将迎来一座“超级大站”,预计2027年竣工......

深圳好玩
2024-11-26 12:55:47
人民币突发“贬值”!11月26号,今日凌晨的三大消息出炉!

人民币突发“贬值”!11月26号,今日凌晨的三大消息出炉!

风口招财猪
2024-11-26 02:36:53
范冰冰年轻时候在西班牙拍写真,谁敢说她胖?明明这个身材刚刚好

范冰冰年轻时候在西班牙拍写真,谁敢说她胖?明明这个身材刚刚好

一只爱8卦的小月巴子
2024-11-22 17:51:22
张维为:若俄导弹打到美国 各州定会乱成一锅粥

张维为:若俄导弹打到美国 各州定会乱成一锅粥

看看新闻Knews
2024-11-26 14:23:12
劝你赶紧存钱!又回到了工资3000元的时代了

劝你赶紧存钱!又回到了工资3000元的时代了

笑熬浆糊111
2024-11-26 00:05:22
9.24亿中标!济南平阴县出让低空经济30年特许经营权

9.24亿中标!济南平阴县出让低空经济30年特许经营权

红星资本局
2024-11-26 19:10:23
以总理被123国通缉后,不到24小时,250枚火箭弹让以色列一片火海

以总理被123国通缉后,不到24小时,250枚火箭弹让以色列一片火海

环球Talk
2024-11-26 23:07:01
吉林男子认同学40岁母亲为干妈,每周去其家中蹭饭酿血案

吉林男子认同学40岁母亲为干妈,每周去其家中蹭饭酿血案

青丝人生
2023-12-27 20:34:50
日媒体最新报道,给了王楚钦新的评价,之前从来没有过

日媒体最新报道,给了王楚钦新的评价,之前从来没有过

体坛狗哥
2024-11-26 16:15:05
医生研究发现:经常吃苹果的人,不出5个月,身体或出现3个变化

医生研究发现:经常吃苹果的人,不出5个月,身体或出现3个变化

荷兰豆爱健康
2024-11-13 19:14:31
中国10大最毒零食排行榜,常吃等于“慢性自杀”

中国10大最毒零食排行榜,常吃等于“慢性自杀”

新兴网评
2024-10-22 00:57:07
世界波+双响,小蜘蛛打脸瓜帅!6-0吊打弱旅,马竞豪取6连胜

世界波+双响,小蜘蛛打脸瓜帅!6-0吊打弱旅,马竞豪取6连胜

我的护球最独特
2024-11-27 03:47:26
前美国情报官里特表示,拜登可能在2025年1月20日之前发动战争

前美国情报官里特表示,拜登可能在2025年1月20日之前发动战争

坠入二次元的海洋
2024-11-26 18:31:13
2024-11-27 04:39:00
马哥Linux云计算
马哥Linux云计算
知识萃取精华,赋能技术人生
93文章数 1054关注度
往期回顾 全部

科技要闻

"这是国产化最高,也是史上最强的Mate"

头条要闻

墨西哥总统称墨不是中国产品转口美国的途径 中方回应

头条要闻

墨西哥总统称墨不是中国产品转口美国的途径 中方回应

体育要闻

勒沃库森3分钟两球!维尔茨点射、格里马尔多任意球破门

娱乐要闻

权威奖项沦为资本工具?谁来管一管

财经要闻

洪灏刘煜辉对谈实录 涉及A股、债务等!

汽车要闻

解决油车无法处理的难题 仰望U7数字底盘这么强

态度原创

时尚
本地
健康
教育
艺术

秋冬多穿彩色吧!减龄又好看

本地新闻

城市24小时|领跑万亿城市,武汉“开挂”了?

花18万治疗阿尔茨海默病,值不值?

教育要闻

TTS新传论文带读:感觉“数字新闻业”这个概念真的要考哎!!!

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

无障碍浏览 进入关怀版