原文地址: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. Thread 多线程 同步

    当多个线程,访问同一个对象,调用同一个方法或访问同一个对象时.有时,必须保证访问的同步性.比如,一个银行信用卡账户具有5000元的信用额度.用户除具有一张主卡外,还办有多张子卡.这些卡的累计消费金额, ...

  2. 发现一个form小问题

    在使用编辑器及框架时,form表单如果在太靠内的div层里,就取不到textarea的post值,具体原因位置,可能跟框架的CSS有关

  3. 写把proto函数搞清楚

    在做blk层之前,先把proto搞清楚 ffi_lua metatype可以给函数加方法, lua中冒号是啥意思?冒号会传入self,但是点号不会传入self

  4. 如何出发匿名映射呀【log】

    malloc-9711 [002] .... 40794.642938: mm_vmscan_lru_shrink_inactive: nid=0 zid=1 nr_scanned=3 nr_recl ...

  5. 03 Java 修饰符

    Java 修饰符主要分为两类: 访问修饰符 非访问修饰符 访问修饰符 public,对所有类可见 protected,对同一包内的类和子类可见 default,同一个包内的类可见 private,对当 ...

  6. javascript中在定义函数的几种形式

    内容主要是讲述javascript在类(原型对象)中定义方法的几种形式,简要之主要有三种:this关键字.prototype关键字.var 对象名={name:value,name2:value2}: ...

  7. Postfix+Sasl+Courier-authlib+Dovecot+MySQL+extmail 邮件系统部署

    # yum remove postfix ##删除系统自带postfix# userdel postfix# groupdel postdrop# groupadd -g 2525 postfix# ...

  8. WINDOWS2008 KMS 服务器安装及激活

    搭建环境条件: windows server 2008 enterprise 安装光盘kms密钥kms服务安装步骤: 安装第一台windows server 2008 enterprise服务器用km ...

  9. 解决jquery与zepto等其它库冲突兼容的问题

    解决jquery与zepto等其它库冲突兼容的问题;(function ($) {    }) (jQuery); ;(function ($) {    }) (Zepto); 在Bootstrap ...

  10. tips 前端 移动端 web iscroll 5 自译文档 api速查

    iscroll 可以做的 1,模拟原生的ios 或者android等设备的元素滚动,app里的那种顺滑的滚动,仅仅使用一个轻量的js库实现(甚至更酷炫的视觉感受) 2,手机端流行的下拉刷新,ajax异 ...