Go語(yǔ)言通過(guò)archive/zip和compress/gzip包實(shí)現(xiàn)文件壓縮解壓,支持ZIP多文件打包與GZIP單文件壓縮,結(jié)合合理項(xiàng)目結(jié)構(gòu)可構(gòu)建高效工具。
在Go語(yǔ)言開發(fā)中,處理文件的壓縮與解壓是常見(jiàn)的需求,比如日志歸檔、數(shù)據(jù)備份或文件傳輸優(yōu)化。Golang標(biāo)準(zhǔn)庫(kù)提供了強(qiáng)大的支持,尤其是 archive/zip 和 compress/gzip 包,可以輕松實(shí)現(xiàn) zip 和 gzip 格式的壓縮與解壓功能。下面是一個(gè)完整的項(xiàng)目結(jié)構(gòu)設(shè)計(jì)與核心代碼實(shí)現(xiàn),幫助你快速構(gòu)建一個(gè)實(shí)用的文件壓縮解壓工具。
ZIP 是最常用的壓縮格式,適用于多個(gè)文件打包。Golang 的 archive/zip 包支持讀寫 ZIP 文件。
壓縮多個(gè)文件為 ZIP
以下函數(shù)將指定路徑的多個(gè)文件打包成一個(gè) ZIP 文件:
立即學(xué)習(xí)“go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;
func CompressToZip(filePaths []string, destZip string) error { zipfile, err := os.Create(destZip) if err != nil { return err } defer zipfile.Close() <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">archive := zip.NewWriter(zipfile) defer archive.Close() for _, filePath := range filePaths { err = addToZip(archive, filePath) if err != nil { return err } } return nil
}
func addToZip(archive *zip.Writer, filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close()
info, err := file.Stat() if err != nil { return err } header, err := zip.FileInfoHeader(info) if err != nil { return err } header.Name = filepath.Base(filename) header.Method = zip.Deflate writer, err := archive.CreateHeader(header) if err != nil { return err } _, err = io.Copy(writer, file) return err
}
解壓 ZIP 文件到目標(biāo)目錄
將 ZIP 文件中的內(nèi)容逐個(gè)提取出來(lái):
func DecompressZip(zipPath, destDir string) error { r, err := zip.OpenReader(zipPath) if err != nil { return err } defer r.Close() <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for _, file := range r.File { filePath := filepath.Join(destDir, file.Name) if file.FileInfo().IsDir() { os.MkdirAll(filePath, os.ModePerm) continue } if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil { return err } outFile, err := os.Create(filePath) if err != nil { return err } rc, err := file.Open() if err != nil { outFile.Close() return err } _, err = io.Copy(outFile, rc) rc.Close() outFile.Close() if err != nil { return err } } return nil
}
GZIP 通常用于單個(gè)文件壓縮,常用于網(wǎng)絡(luò)傳輸或日志壓縮。使用 compress/gzip 包即可實(shí)現(xiàn)。
GZIP 壓縮單個(gè)文件
func CompressGzip(srcFile, destGzip string) error { src, err := os.Open(srcFile) if err != nil { return err } defer src.Close() <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">dst, err := os.Create(destGzip) if err != nil { return err } defer dst.Close() gz := gzip.NewWriter(dst) defer gz.Close() _, err = io.Copy(gz, src) return err
}
GZIP 解壓文件
func DecompressGzip(srcGzip, destFile string) error { src, err := os.Open(srcGzip) if err != nil { return err } defer src.Close() <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">gz, err := gzip.NewReader(src) if err != nil { return err } defer gz.Close() dst, err := os.Create(destFile) if err != nil { return err } defer dst.Close() _, err = io.Copy(dst, gz) return err
}
為了便于維護(hù)和擴(kuò)展,推薦如下目錄結(jié)構(gòu):
main.go 示例調(diào)用:
func main() { files := []string{"file1.txt", "file2.txt"} err := compressor.CompressToZip(files, "output.zip") if err != nil { log.Fatal(err) } <pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">err = compressor.DecompressZip("output.zip", "./extracted") if err != nil { log.Fatal(err) }
}
實(shí)際使用中需注意以下幾點(diǎn):
基本上就這些。Golang 的標(biāo)準(zhǔn)庫(kù)已經(jīng)足夠強(qiáng)大,無(wú)需引入第三方依賴即可完成大多數(shù)壓縮任務(wù)。合理封裝后,可作為通用模塊集成進(jìn)各類服務(wù)中。不復(fù)雜但容易忽略的是路徑處理和資源釋放,務(wù)必確保 Close 被正確調(diào)用。
以上就是Golang文件壓縮解壓功能實(shí)現(xiàn)項(xiàng)目的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)