golang zip 壓縮,解壓(含目錄檔案)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

每天學習一點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.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 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.Nameerr = 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)}}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.