原文地址: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包的使用的更多相关文章

  1. Linux RPM、TAR包管理

    一.RPM软件包命令的使用 RPM主要有5种基本操作模式:安装.卸载.刷新.升级及查询.下面分别介绍. 1.安装软件包 命令语法: rpm -ivh [RPM包文件名称] 命令中各参数的含义如下: - ...

  2. tar包和jar包和war包的区别?

    tar:tar是*nix下的打包工具,生成的包通常也用tar作为扩展名,其实tar只是负责打包,不一定有压缩,事实上可以压缩,也可以不压缩,通常你看到xxxx.tar.gz,就表示这个tar包是压缩的 ...

  3. 使用mybatis assembly插件打成tar包,在linux系统中运行服务

    使用mybatis assembly插件打成tar包,在linux系统中运行服务 assembly插件插件地址: 链接:https://pan.baidu.com/s/1i6bWPxF 密码:gad5 ...

  4. C++实现tar包解析

    tar(tape archive)是Unix和类Unix系统上文件打包工具,可以将多个文件合并为一个文件,使用tar工具打出来的包称为tar包.一般打包后的文件名后缀为".tar" ...

  5. 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 ...

  6. tar 只解压tar包中某个文件

    sh-4.1# ls test.tar sh-4.1# tar -tf test.tar ./ecs20161207.png ./ecs.png ./ecs.xml ./rds.png ./Scree ...

  7. find 查找文件 -exec 然后压缩 查看tar包的内容

    [root@cs Downloads]# find ./ -name "banner*" -exec tar -cvf k.tar "{}" \; ./bann ...

  8. Unix系统解压tar包时出现@LongLink错误

    Unix系统上使用tar命令解压tar包后,多了一个@LongLink的文件,并且原来的tar包解压后不完整.网上查了下,原因是AIX系统上tar命令自身的一个缺陷.解决办法:把该tar包上传到lin ...

  9. linux tar包追加问题【转】

    只能已归档的文件才能追加文件. 如果tar.gz文件是如此生成:#tar -zcvf test.tar.gz  a.txt即tar.gz是压缩(-z)和归档(-c)文件,则无法给它追加文件:若果tar ...

随机推荐

  1. 点对点协议(Point-to-Point Protocol)

    简介 点对点协议简称PPP协议,工作在数据链路层.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机. 网桥和路由器之间简单连接的一种共通的解决方案. PPP协议的组成 建立 ...

  2. 在Eclipse中调用weka包实现分类

    1.如题. 最近写了一个FCM的聚类算法,希望能够可视化结果,因此一个想法是调用weka中的包,使自己的程序可以可视化.这里参考了网络上的方法,首先实现在Eclipse中调用weka包实现分类的功能. ...

  3. linux下对/sys/class/gpio中的gpio的控制 (转)

        在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/clas ...

  4. saltstack 实现haproxy+keepalived

    1.目录结构规划如下 mkdir -p /srv/salt/prod/haproxy mkdir -p /srv/salt/prod/keepalived mkdir -p /srv/salt/pro ...

  5. freemarker 前端 判读 遍历 取值

    <#if content?length gt 100> ${content[0..100]}... <#else> ${content} </#if> freema ...

  6. [ CodeVS冲杯之路 ] P1116

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1116/ 数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色 这里我使用 ...

  7. android hook 框架 ADBI 如何实现so函数挂钩

    上一篇 android 5 HOOK 技术研究之 ADBI 项目 02 分析了hijack.c, 这个文件编译为一个可执行程序 hijack, 该程序实现了向目标进程注入一个动态库的功能.这一篇继续研 ...

  8. http请求分析

    一个Http请求一般始于如下几种方式: 1.在浏览器中输入一个URL地址 2.网页中的一个超链接 3.Response.Redirect("http://www.sohu.com" ...

  9. Java进阶之路,技术要点

    宏观方面 一.JAVA.要想成为JAVA(高级)工程师肯定要学习JAVA.一般的程序员或许只需知道一些JAVA的语法结构就可以应付了.但要成为JAVA(高级)工程师,您要对JAVA做比较深入的研究.您 ...

  10. 在C#中将金额转换成中文大写金额

    具体代码如下: /// <summary> /// 金额转换成中文大写金额 /// </summary> /// <param name="LowerMoney ...