2021-08-06 来源:华纳网 责任编辑:railgun 人气:
核心提示:【谷雨课堂】Go实战 No.028 Go干货!压缩与解压缩ZIP

知识点:

压缩与解压缩

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.Nameif 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/




 





免责声明:本文仅代表作者个人观点,与华纳网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。