知识点:
压缩与解压缩
ZIP文件
本课内容:
大家好,欢迎来到谷雨课堂
文件压缩与解压缩同学们再熟悉不过了,
ZIP这三个字母估计没有人不了解的
本节干货我们就使用Go来进行文件及目录的压缩及解压缩
非常用实用,
谷雨老师把压缩和解压缩封装成为了两个函数,
同样也是拿过来就可以用
当然还是有很多优化改进的空间的
package main
import (
"archive/zip"
"fmt"
"io"
"os"
"strings"
)
//压缩文件
//files 文件数组,可以是不同dir下的文件或者目录
func ToZip(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 UnZip(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])
}
func main() {
f1, _ := os.Open("yarn-1.22.5.msi")
defer f1.Close()
f2, _ := os.Open("SocketTool.exe")
defer f2.Close()
f3, _ := os.Open("dir1")
defer f3.Close()
var files = []*os.File{f1, f2, f3}
fmt.Println("创建压缩文件")
ToZip(files, "./1.zip")
fmt.Println("解压缩Zip文件")
UnZip("./1.zip", "./dir_out")
}
延伸阅读:
1985年一家名为SEA(System Enhancement Associates,系统增强伙伴)的小公司开发了一个在MS-DOS平台下的商业压缩软件,名为ARC。当时的软件发行方式略有不同,用户购买了软件,除了得到软件的可执行文件还包括一份C语言的源代码。当时的卡茨与很多用计算机的平民一样,缺乏资金购买大量的商业软件,当时卡茨从网上下载了一份ARC的C语言源代码,并用汇编语言将其全新编写并编译出来。卡茨将这个软件命名为:PKARC(Phillip Katz' ARC)。几周后,卡茨制作出新压缩软件PKZIP(Phillip Katz' ZIP),这款全新的软体比ARC的压缩率、压缩性能都要高许多,并且包含更多功能。此后,卡茨还将ZIP的所有技术参数公诸于众。ZIP(含义“速度”)这一名称是由卡茨的朋友罗伯特·马宏利(Robert Mahoney)建议的。他们想暗示,他们的产品比ARC在一定时间内更快速。
ZIP是一种相当简单的分别压缩每个文件的存档格式。分别压缩文件允许不必读取另外的数据而检索独立的文件;理论上,这种格式允许对不同的文件使用不同的算法。不管用何种方法,对这种格式的一个告诫是对于包含很多小文件的时候,存档会明显的比压缩成一个独立的文件(在类Unix系统中一个经典的例子是普通的tar.gz存档是由一个使用gzip压缩的TAR存档组成)要大。
ZIP的规约指出文件可以不经压缩或者使用不同的压缩算法来存储。然而,在实际上,ZIP几乎差不多总是在使用卡茨(Katz)的DEFLATE算法。
ZIP支持基于对称加密系统的一个简单的密码,已知有严重的缺陷,已知明文攻击,字典攻击和暴力攻击。ZIP也支持分卷压缩。
完整的源代码可以登录【华纳网】下载。
https://www.worldwarner.com/
免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。