原文地址: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. hadoop2.5.2学习及实践笔记(六)—— Hadoop文件系统及其java接口

    文件系统概述 org.apache.hadoop.fs.FileSystem是hadoop的抽象文件系统,为不同的数据访问提供了统一的接口,并提供了大量具体文件系统的实现,满足hadoop上各种数据访 ...

  2. 第一次使用iptables

    sudo iptables -A OUTPUT -m cgroup ! --cgroup 0x100001 -j DROP 第一次使用iptables就把电脑弄得上不了网了...... 下面这个地址讲 ...

  3. Uva10635 Prince and Princess

    题目戳这里 这题如果用\(f_{i,j}\)这样dp的话肯定过不了,必须另辟蹊径.题目说了数字不重复.我们先只留下两个数组共有的数字.然后我们处理出这样一个数组\(S\),\(S_i\)表示\(A_i ...

  4. Eclipse EE导入maven工程

    Eclipse EE下载地址:https://eclipse.org/downloads/ 启动Eclipse后,点击File->Import,选择Existing Maven Projects ...

  5. Tomcat学习笔记(二)

    Servlet浅析 javax.servlet.Servlet是一个接口,所有的Servlet必须实现接口里面的方法. 该接口在tomcat/bin中的servlet-api.jar包中. Servl ...

  6. Codeforces 938.A Word Correction

    A. Word Correction time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. poj1679 次最小生成树 kruskal(暴力枚举)

    Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...

  8. es6+最佳入门实践(3)

    3.数组扩展 3.1.扩展运算符 扩展运算符用三个点(...)表示,从字面上理解,它的功能就是把数组扩展开来,具体形式如下: let arr = [1, 2, 3]; console.log(...a ...

  9. WPF中的URI

    在 Windows Presentation Foundation (WPF) 中,使用统一资源标识符 (URI) 标识和加载文件的方式有很多,包括: 指定当应用程序第一次启动时显示的用户界面 (UI ...

  10. 培训补坑(day5:最小生成树+负环判断+差分约束)

    补坑补坑((╯‵□′)╯︵┻━┻) 内容真的多... 一个一个来吧. 首先是最小生成树. 先讲一下生成树的定义 生成树就是在一张图上选取一些边,使得整个图上所有的点都连通. 那么我们要求的最小生成树有 ...