博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang tar gzip 压缩,解压(含目录文件)
阅读量:6000 次
发布时间:2019-06-20

本文共 1951 字,大约阅读时间需要 6 分钟。

tar是用于文件归档,gzip用于压缩。仅仅用tar的话,达不到压缩的目的。我们常见的tar.gz就是用gzip压缩生成的tar归档文件。

go实现tar压缩与解压与zip类似,区别在于tar需要使用gzip进行处理。tar与zip的Header不同。代码如下

package tartestimport (	"archive/tar"	"compress/gzip"	"io"	"os"	"strings")//压缩 使用gzip压缩成tar.gzfunc Compress(files []*os.File, dest string) error {	d, _ := os.Create(dest)	defer d.Close()	gw := gzip.NewWriter(d)	defer gw.Close()	tw := tar.NewWriter(gw)	defer tw.Close()	for _, file := range files {		err := compress(file, "", tw)		if err != nil {			return err		}	}	return nil}func compress(file *os.File, prefix string, tw *tar.Writer) error {	info, err := file.Stat()	if err != nil {		return err	}	if info.IsDir() {		prefix = prefix + "/" + info.Name()		fileInfos, err := file.Readdir(-1)		if err != nil {			return err		}		for _, fi := range fileInfos {			f, err := os.Open(file.Name() + "/" + fi.Name())			if err != nil {				return err			}			err = compress(f, prefix, tw)			if err != nil {				return err			}		}	} else {		header, err := tar.FileInfoHeader(info, "")		header.Name = prefix + "/" + header.Name		if err != nil {			return err		}		err = tw.WriteHeader(header)		if err != nil {			return err		}		_, err = io.Copy(tw, file)		file.Close()		if err != nil {			return err		}	}	return nil}//解压 tar.gzfunc DeCompress(tarFile, dest string) error {	srcFile, err := os.Open(tarFile)	if err != nil {		return err	}	defer srcFile.Close()	gr, err := gzip.NewReader(srcFile)	if err != nil {		return err	}	defer gr.Close()	tr := tar.NewReader(gr)	for {		hdr, err := tr.Next()		if err != nil {			if err == io.EOF {				break			} else {				return err			}		}		filename := dest + hdr.Name		file, err := createFile(filename)		if err != nil {			return err		}		io.Copy(file, tr)	}	return nil}func createFile(name string) (*os.File, error) {	err := os.MkdirAll(string([]rune(name)[0:strings.LastIndex(name, "/")]), 0755)	if err != nil {		return nil, err	}	return os.Create(name)}

 

转载于:https://www.cnblogs.com/xiaofengshuyu/p/5646494.html

你可能感兴趣的文章
【YUM】第三方yum源rpmforge
查看>>
IOS(CGGeometry)几何类方法总结
查看>>
学会放下包袱,热爱单例
查看>>
一个通用并发对象池的实现
查看>>
才知道系列之GroupOn
查看>>
⑲云上场景:超级减肥王,基于OSS的高效存储实践
查看>>
linux kswapd浅析
查看>>
EJB,产品 or 标准?
查看>>
openstack newton 负载均衡Lbaas配置
查看>>
2016年4月7日
查看>>
SpringData+Redis存储
查看>>
C#中用SharpZipLib生成gzip/解压文件
查看>>
JSON Tips
查看>>
Visual Studio 2013 配置OpenGL环境变量
查看>>
iOS开发网络篇之文件下载、大文件下载、断点下载
查看>>
Haproxy安装部署
查看>>
Sublime Text 3 插入日期时间等
查看>>
ios应用程序图标问题
查看>>
mac下安装mysql
查看>>
牛客网《JavaScript》能力评测练习2
查看>>