golang壓縮和解壓縮zip檔案
golang壓縮和解壓縮zip檔案
一個簡單例子說明如何使用golang提供的archive/zip包實現zip檔案的壓縮和解壓縮。
壓縮
提供兩個引數:
- 一個是輸入原始檔
- 另一個是輸出zip壓縮檔案
其中輸入原始檔可以是一個檔案,也可以好似一個目錄,如果是目錄那麼目錄下的所有檔案都會被壓縮到輸出。
當然這個函式很容易被擴充套件成支援多個輸入原始檔/目錄的情況。
// srcFile could be a single file or a directory func Zip(srcFile string, destZip string) error { zipfile, err := os.Create(destZip) if err != nil { return err } defer zipfile.Close() archive := zip.NewWriter(zipfile) defer archive.Close() filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error { if err != nil { return err } header, err := zip.FileInfoHeader(info) if err != nil { return err } header.Name = path if info.IsDir() { header.Name += "/" } else { header.Method = zip.Deflate } writer, err := archive.CreateHeader(header) if err != nil { return err } if ! info.IsDir() { file, err := os.Open(path) if err != nil { return err } defer file.Close() _, err = io.Copy(writer, file) } return err }) return err }
解壓縮
也有提供兩個引數:
- 一個是輸入源zip檔案
- 另一個是輸出路徑
func Unzip(zipFile string, destDir string) error { zipReader, err := zip.OpenReader(zipFile) if err != nil { return err } defer zipReader.Close() for _, f := range zipReader.File { fpath := filepath.Join(destDir, f.Name) if f.FileInfo().IsDir() { os.MkdirAll(fpath, os.ModePerm) } else { if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil { return err } inFile, err := f.Open() if err != nil { return err } defer inFile.Close() outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) if err != nil { return err } defer outFile.Close() _, err = io.Copy(outFile, inFile) if err != nil { return err } } } return nil }