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 ...
随机推荐
- Error: could not find java.dll 解决办法
Error: could not find java.dll 问题: 安装配置Java环境变量后,在命令行中运行java -version进行测试时却出现下面的问题: Error: opening r ...
- 【bzoj4154】[Ipsc2015]Generating Synergy KD-tree
题目描述 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 输入 第一行一个数T,表示数据组数 接下来每组数据的第一行三个数n,c,q表示结 ...
- [poj] 3304 Segments || 判断线段相交
原题 给出n条线段,判断是否有一条直线与所有线段都有交点 若存在这样一条直线,那么一定存在一条至少过两个线段的端点的直线满足条件. 每次枚举两条线段的两个端点,确定一条直线,判断是否与其他线段都有交点 ...
- JS设置、获取DOM自定义属性
jQuery方式 // 获取 $('#test').attr('mydata'); // 设置 $('#test').attr('mydata','data-content'); // 移除 $('# ...
- laravel的elixir和gulp用来对前端施工
使用laravel elixer npm install --global gulp ok 然后在安装好的laravel 下 npm install 以安装 laravel-elixir subli ...
- Hibernate 中 get()和load()的区别
一.1.程序检索数据库中不存在的OID: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回nu ...
- linux下搭建SVN服务器完全手册【转】
转自:http://blog.csdn.net/bullbat/article/details/9115559 系统环境 RHEL5.4最小化安装(关iptables,关selinux) ...
- flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)
flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...
- blog postman 翻译(2):postman中新增request attributes 的描述(desc)
blog的原文链接是:http://blog.getpostman.com/2017/06/03/descriptions-for-request-attributes-in-postman/ pos ...
- Good Bye 2016 A. New Year and Hurry【贪心/做题目每道题花费时间按步长为5等差增长,求剩余时间够做几道题】
A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...