在日常开发中,我们经常需要处理 ZIP 文件,例如从远程服务器下载压缩包后解压、备份数据或处理日志文件等。在本文中,我们将介绍一个使用 Go 语言编写的高效 ZIP 文件解压工具,并提供示例代码帮助你快速上手。
代码实现
以下是 Unzip
函数的完整实现,它可以将 ZIP 文件解压到指定的目录,并返回解压后的文件路径列表。
go
package utils
import (
"archive/zip"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
// Unzip 解压 ZIP 文件到指定目录
func Unzip(zipFile string, destDir string) ([]string, error) {
zipReader, err := zip.OpenReader(zipFile)
var paths []string
if err != nil {
return []string{}, err
}
defer zipReader.Close()
for _, f := range zipReader.File {
if strings.Index(f.Name, "..") > -1 {
return []string{}, fmt.Errorf("%s 文件名不合法", f.Name)
}
fpath := filepath.Join(destDir, f.Name)
paths = append(paths, fpath)
if f.FileInfo().IsDir() {
os.MkdirAll(fpath, os.ModePerm)
} else {
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return []string{}, err
}
inFile, err := f.Open()
if err != nil {
return []string{}, err
}
defer inFile.Close()
outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return []string{}, err
}
defer outFile.Close()
_, err = io.Copy(outFile, inFile)
if err != nil {
return []string{}, err
}
}
}
return paths, nil
}
使用示例
在 main.go
文件中,我们可以使用 Unzip
方法来解压 ZIP 文件。
go
package main
import (
"fmt"
"log"
"utils"
)
func main() {
zipFile := "example.zip" // 需要解压的 ZIP 文件
destDir := "output" // 解压目标目录
files, err := utils.Unzip(zipFile, destDir)
if err != nil {
log.Fatalf("解压失败: %v", err)
}
fmt.Println("解压成功,文件列表:")
for _, file := range files {
fmt.Println(file)
}
}
代码解析
- 打开 ZIP 文件 :
zip.OpenReader(zipFile)
用于打开 ZIP 文件。 - 遍历 ZIP 内部文件 :使用
for _, f := range zipReader.File
遍历 ZIP 内的所有文件。 - 安全性检查 :通过
strings.Index(f.Name, "..")
防止路径遍历攻击。 - 创建目录和文件 :使用
os.MkdirAll
创建必要的文件夹,并使用os.OpenFile
创建文件。 - 文件复制 :
io.Copy(outFile, inFile)
复制文件内容。
总结
该 Unzip
方法是一个高效、安全的 ZIP 文件解压工具,适用于各种场景,如文件备份、日志解压和数据处理。你可以根据需求扩展功能,例如支持密码保护的 ZIP 文件、进度条显示等。
希望这篇文章能帮助你更高效地处理 ZIP 文件,欢迎留言交流你的想法!