之前写过一篇关于解压缩的博文,压缩zip和解压缩unzip,但显然其并不是很好用,这里发现之前的Go库管理工具gopm中,实现的解压缩包,算是封装的很好用的zip包了。(这个库是无闻大佬写的,感谢!!!)

这里是地址

zip(Go Walker) 和 tz(Go Walker) 都允许你轻易的读取或写入 ZIP/TAR.GZ 压缩档案和其内部文件。

  • 特性:
    • 将任意位置的文件或目录加入档案,没有一对一的操作限制。
    • 只解压部分文件,而非一次性解压全部。
    • 将数据以流的形式直接写入 io.Writer 而不需经过文件系统的存储。

实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func main() {

//err := cae.Copy("1.txt_bak", "./ones/1.txt")
//fmt.Println(err)

zipArchive, err := zip.Create("one.zip")
if err != nil {
fmt.Println(err)
return
}

// "/one/test",在压缩包所处的位置
err = zipArchive.AddDir("/one/test", "E:\\Project\\testCae\\ones")
if err != nil {
fmt.Println(err)
return
}

// 把之前添加的文件或文件夹都进行落盘操作
err = zipArchive.Flush()
if err != nil {
fmt.Println(err)
return
}

// close里头同样调用了Flush()
err = zipArchive.Close()
if err != nil {
fmt.Println(err)
return
}
}

创建一个Zip的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 打开一个ZIP包,选择打开的方式[os.O_RDWR|os.O_CREATE|os.O_TRUNC],返回zip句柄
func OpenFile(name string, flag int, perm os.FileMode) (*ZipArchive, error) {
z := new(ZipArchive)
err := z.Open(name, flag, perm)
return z, err
}

// 新建zip句柄
func Create(name string) (*ZipArchive, error) {
os.MkdirAll(path.Dir(name), os.ModePerm)
return OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
}

// 以只读的方式打开zip包
func Open(name string) (*ZipArchive, error) {
return OpenFile(name, os.O_RDONLY, 0)
}

获得句柄后,进行zip相关操作。

库中有一个中间函数type HookFunc func(string, os.FileInfo) error,传入的参数是filename,和,file的信息。用于在压缩或者解压每一个文件时,若需要做相应的处理,则传入这个自定义函数即可。

详细到每个函数使用,可以直接查看zip_test.go。更为详细了解整个操作。