golang之archive/tar包的使用
原文地址:http://www.niu12.com/article/36
github地址:https://github.com/ZQCard/go_api_practice
// tar包实现了文件的打包功能,可以将多个文件或者目录存储到单一的.tar压缩文件中
// tar本身不具有压缩功能,只能打包文件或目录
package main
import (
"archive/tar"
"fmt"
"io"
"os"
)
func main() {
// 普通文件
unTarFileName := "archive/tar/example/tar_example.txt"
// 压缩文件
tarFileName := "archive/tar/example/tar_example.tar"
// 将普通文件生成压缩文件
res := Tar(unTarFileName, tarFileName)
switch res.(type) {
case error:
fmt.Println("打包失败:",res)
case bool:
fmt.Println("打包成功")
}
// 将压缩文件解压
tarFileName2 := "archive/tar/example/untar_example.tar"
unTarFilePath := "archive/tar/example/untar_example/"
res2 := UnTar(tarFileName2, unTarFilePath)
switch res2.(type) {
case error:
fmt.Println("解压失败:",res)
case bool:
fmt.Println("解压成功")
}
}
func Tar(unTarFileName string, tarFileName string) interface{} {
// 打开源文件
sourceFile, err := os.Open(unTarFileName)
defer sourceFile.Close()
if err != nil {
return err
}
/* 向 tar 文件中写入数据是通过 tar.Writer 完成的,所以首先要创建 tar.Writer,
可以通过 tar.NewWriter 方法来创建它,该方法要求提供一个 os.Writer 对象,
以便将打包后的数据写入该对象中。
可以先创建一个文件,然后将该文件提供给 tar.NewWriter 使用。
*/
// 创建文件用于储存打包后的数据
destinationFile, err := os.Create(tarFileName)
if err != nil {
return err
}
defer destinationFile.Close()
/* 创建tar.Writer对象.此时,我们就拥有了一个 tar.Writer 对象 tw,可以用它来打包文件了。
这里要注意一点,使用完 tw 后,一定要执行 tw.Close() 操作,
因为 tar.Writer 使用了缓存,tw.Close() 会将缓存中的数据写入到文件中,
同时 tw.Close() 还会向 .tar 文件的最后写入结束信息,如果不关闭 tw 而直接退出程序,
那么将导致 .tar 文件不完整。
存储在 .tar 文件中的每个文件都由两部分组成:文件头信息和文件内容,
所以向 .tar 文件中写入每个文件都要分两步:
第一步写入文件信息,第二步写入文件数据。
对于目录来说,由于没有内容可写,所以只需要写入目录信息即可。
*/
tw := tar.NewWriter(destinationFile)
defer tw.Close()
// 获取源文件信息
sourceFileInfo, err := os.Stat(unTarFileName)
if err != nil {
return err
}
// 根据 os.FileInfo创建tar.Header信息头
hdr, err := tar.FileInfoHeader(sourceFileInfo, "")
// 第一步写入头文件信息,通过tw.WriteHeader方法将hdr写入.tar文件中
if err := tw.WriteHeader(hdr); err != nil {
return err
}
// 第二部,写入数据
_, err = io.Copy(tw, sourceFile)
if err != nil {
return err
}
return true
}
func UnTar(tarFileName string, unTarFilePath string) interface{} {
// 将压缩文件生成普通文件
// 解包的方法,从 .tar 文件中读出数据是通过 tar.Reader 完成的,
// 所以首先要创建 tar.Reader,可以通过 tar.NewReader 方法来创建它.
// 该方法要求提供一个 os.Reader 对象,
// 以便从该对象中读出数据。可以先打开一个 .tar 文件,
// 然后将该文件提供给 tar.NewReader 使用。
// 这样就可以将 .tar 文件中的数据读出来了:
tarFile, err := os.Open(tarFileName)
if err != nil {
return err
}
defer tarFile.Close()
// 创建tar.Reader 准备进行解包
tr := tar.NewReader(tarFile)
// 重新生成文件夹
path,err := os.Stat(unTarFilePath)
if path != nil{
os.RemoveAll(unTarFilePath)
}
os.Mkdir(unTarFilePath, os.ModePerm)
// 遍历包中的文件
// 遍历压缩包中的文件
for{
hdr, err := tr.Next()
if err == io.EOF {
// 读取到文件目录,跳出循环
break
}
if err != nil {
return err
}
fileName := unTarFilePath + hdr.Name
_,err = os.Create(fileName)
if err != nil {
return err
}
fw, err := os.OpenFile(fileName, os.O_CREATE | os.O_WRONLY, 0777)
if err != nil {
return err
}
_, err = io.Copy(fw, tr)
if err != nil{
return err
}
}
return true
}
golang之archive/tar包的使用的更多相关文章
- Linux RPM、TAR包管理
一.RPM软件包命令的使用 RPM主要有5种基本操作模式:安装.卸载.刷新.升级及查询.下面分别介绍. 1.安装软件包 命令语法: rpm -ivh [RPM包文件名称] 命令中各参数的含义如下: - ...
- tar包和jar包和war包的区别?
tar:tar是*nix下的打包工具,生成的包通常也用tar作为扩展名,其实tar只是负责打包,不一定有压缩,事实上可以压缩,也可以不压缩,通常你看到xxxx.tar.gz,就表示这个tar包是压缩的 ...
- 使用mybatis assembly插件打成tar包,在linux系统中运行服务
使用mybatis assembly插件打成tar包,在linux系统中运行服务 assembly插件插件地址: 链接:https://pan.baidu.com/s/1i6bWPxF 密码:gad5 ...
- C++实现tar包解析
tar(tape archive)是Unix和类Unix系统上文件打包工具,可以将多个文件合并为一个文件,使用tar工具打出来的包称为tar包.一般打包后的文件名后缀为".tar" ...
- Centos7.5安装分布式Hadoop2.6.0+Hbase+Hive(CDH5.14.2离线安装tar包)
Tags: Hadoop Centos7.5安装分布式Hadoop2.6.0+Hbase+Hive(CDH5.14.2离线安装tar包) Centos7.5安装分布式Hadoop2.6.0+Hbase ...
- tar 只解压tar包中某个文件
sh-4.1# ls test.tar sh-4.1# tar -tf test.tar ./ecs20161207.png ./ecs.png ./ecs.xml ./rds.png ./Scree ...
- find 查找文件 -exec 然后压缩 查看tar包的内容
[root@cs Downloads]# find ./ -name "banner*" -exec tar -cvf k.tar "{}" \; ./bann ...
- Unix系统解压tar包时出现@LongLink错误
Unix系统上使用tar命令解压tar包后,多了一个@LongLink的文件,并且原来的tar包解压后不完整.网上查了下,原因是AIX系统上tar命令自身的一个缺陷.解决办法:把该tar包上传到lin ...
- linux tar包追加问题【转】
只能已归档的文件才能追加文件. 如果tar.gz文件是如此生成:#tar -zcvf test.tar.gz a.txt即tar.gz是压缩(-z)和归档(-c)文件,则无法给它追加文件:若果tar ...
随机推荐
- NBUT校赛 J Alex’s Foolish Function(分块+延迟标记)
Problem J: Alex’s Foolish Function Time Limit: 8 Sec Memory Limit: 128 MB Submit: 18 Solved: 2 Des ...
- 洛谷树剖模板题 P3384 | 树链剖分
原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...
- Problem b
Problem b 题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入 第一行一个整数 ...
- 如何用js让表格的行也能拖动
行拖动的实现思路非常简单,选中一行,往上拖就与上面的行交换位置,往下拖就与下面的行交换位置.问题是如何得到交换行.我见过一个非常详细的教程,它会把表格里的每一行的高度与Y坐标计算出来,换言之,都时是比 ...
- 【转发】Build Squid with SSL Bump and ICAP Client
原文文档:http://docs.diladele.com/administrator_guide_3_4/installation_and_removal/filtering_https.html ...
- Tomcat学习笔记(四)
Servlet容器部分 servlet容器用来处理请求servlet资源,并为web客服端填充response对象模块,在tomcat中,共有4种类型的容器,分别是:Engine.Host.Conte ...
- mvvm实现
https://segmentfault.com/a/1190000006599500 http://blog.csdn.net/pur_e/article/details/53066275
- FastDfs java客户端上传、删除文件
#配置文件 connect_timeout = 2 network_timeout = 30 charset = UTF-8 http.tracker_http_port = 9090 http.an ...
- Mysql建立触发器
DELIMITER $$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `AddTransferAccountLog` AFTER INSERT ON ...
- C++内联汇编,输出人物名字
DWORD PeopleBase =0x9CD674;//天龙人物基址 //获取人物名称 char * CData::GetPeopleName() { char * name="& ...