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

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

每天学习一点go src。

今天学习了zip包的简单使用,实现了含目录的压缩与解压。

写了两个方法,实现了压缩、解压。

package ziptestimport (	"archive/zip"	"io"	"os"	"strings")//压缩文件//files 文件数组,可以是不同dir下的文件或者文件夹//dest 压缩文件存放地址func Compress(files []*os.File, dest string) error {	d, _ := os.Create(dest)	defer d.Close()	w := zip.NewWriter(d)	defer w.Close()	for _, file := range files {		err := compress(file, "", w)		if err != nil {			return err		}	}	return nil}func compress(file *os.File, prefix string, zw *zip.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, zw)			if err != nil {				return err			}		}	} else {		header, err := zip.FileInfoHeader(info)		header.Name = prefix + "/" + header.Name		if err != nil {			return err		}		writer, err := zw.CreateHeader(header)		if err != nil {			return err		}		_, err = io.Copy(writer, file)		file.Close()		if err != nil {			return err		}	}	return nil}//解压func DeCompress(zipFile, dest string) error {	reader, err := zip.OpenReader(zipFile)	if err != nil {		return err	}	defer reader.Close()	for _, file := range reader.File {		rc, err := file.Open()		if err != nil {			return err		}		defer rc.Close()		filename := dest + file.Name		err = os.MkdirAll(getDir(filename), 0755)		if err != nil {			return err		}		w, err := os.Create(filename)		if err != nil {			return err		}		defer w.Close()		_, err = io.Copy(w, rc)		if err != nil {			return err		}		w.Close()		rc.Close()	}	return nil}func getDir(path string) string {	return subString(path, 0, strings.LastIndex(path, "/"))}func subString(str string, start, end int) string {	rs := []rune(str)	length := len(rs)	if start < 0 || start > length {		panic("start is wrong")	}	if end < start || end > length {		panic("end is wrong")	}	return string(rs[start:end])}

 

测试代码:

package ziptestimport (	"os"	"testing")func TestCompress(t *testing.T) {	f1, err := os.Open("/home/zzw/test_data/ziptest/gophercolor16x16.png")	if err != nil {		t.Fatal(err)	}	defer f1.Close()	f2, err := os.Open("/home/zzw/test_data/ziptest/readme.notzip")	if err != nil {		t.Fatal(err)	}	defer f2.Close()	f3, err := os.Open("/home/zzw/test_data")	if err != nil {		t.Fatal(err)	}	defer f3.Close()	var files = []*os.File{f1, f2, f3}	dest := "/home/zzw/test_data/test.zip"	err = Compress(files, dest)	if err != nil {		t.Fatal(err)	}}func TestDeCompress(t *testing.T) {	err := DeCompress("/home/zzw/test_data/test.zip", "/home/zzw/test_data/de")	if err != nil {		t.Fatal(err)	}}

 

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

你可能感兴趣的文章
福利 | 2018各大技术大会资料汇总(可下载)
查看>>
寻找下一代CTO - 激发潜能把握成功!!
查看>>
用DELPHI 开发压缩、解压、自解压、加密
查看>>
Linux命令行得到系统IP
查看>>
SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>
查看>>
python类型转换、数值操作(收藏)
查看>>
mysql delimiter
查看>>
关于C#静态构造函数的几点说明
查看>>
理解C# 4 dynamic(4) – 让人惊艳的Clay
查看>>
管理-职业化沟通
查看>>
angular之$compile
查看>>
SQL中Truncate的用法
查看>>
一键安装docker-ce
查看>>
彻底理解Netty,这一篇文章就够了
查看>>
极光开发者沙龙 JIGUANG MEETUP —— 移动应用性能优化实践
查看>>
最新的CocoaPods安装步骤 pod install/pod update更新慢等问题
查看>>
高并发下的一些问题
查看>>
如何为Django添加中文搜索服务
查看>>
Spring Cloud Config 统一配置中心
查看>>
Java获取文本文件字符编码的两种方法
查看>>