Golang 如何解压缩文件
Golang 是一种开源的编程语言,它的标准库中自带了压缩文件的解压缩功能。本文将介绍如何在 Golang 中使用标准库进行文件的解压缩操作。
首先,我们需要使用 os 包读取需要解压的文件。以下是一个简单的例子:
package main
import (
"archive/zip"
"fmt"
"os"
)
func main() {
// 打开需要解压的文件
f, err := os.Open("example.zip")
if err != nil {
panic(err)
}
defer f.Close()
}
在上面的代码中,我们打开了一个名为 example.zip 的文件,并使用 defer 关键字确保在函数返回之前关闭文件。
接下来,我们需要使用 zip 包对文件进行解压缩。以下是一个完整的解压缩代码的示例:
package main
import (
"archive/zip"
"fmt"
"os"
)
func main() {
// 打开需要解压的文件
f, err := os.Open("example.zip")
if err != nil {
panic(err)
}
defer f.Close()
// 读取 zip 文件
info, err := f.Stat()
if err != nil {
panic(err)
}
// 创建解压目录
err = os.MkdirAll("unzipped", 0777)
if err != nil {
panic(err)
}
// 解压缩
r, err := zip.NewReader(f, info.Size())
if err != nil {
panic(err)
}
for _, file := range r.File {
filePath := fmt.Sprintf("unzipped/%s", file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(filePath, file.Mode())
continue
}
dir, _ := os.Getwd()
dir += "/" + filePath[0:strings.LastIndex(filePath, "/")]
if ! exists(dir) {
err = os.MkdirAll(dir, file.Mode())
if err != nil {
panic(err)
}
}
outFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode())
if err != nil {
panic(err)
}
defer outFile.Close()
inFile, err := file.Open()
if err != nil {
panic(err)
}
defer inFile.Close()
_, err = io.Copy(outFile, inFile)
if err != nil {
panic(err)
}
fmt.Printf("Extracted: %s\n", filePath)
}
}
func exists(path string) bool {
_, err := os.Stat(path)
if err == nil {
return true
}
if os.IsNotExist(err) {
return false
}
return false
}
以上代码中,首先读取了压缩文件,并使用 zip.NewReader() 函数创建了一个 zip.ReadCloser 对象。对于压缩包中每一个文件,我们都需要将其解压到一个特定的文件路径,并使用 io.Copy() 函数将文件写入磁盘。
值得注意的是,以上示例中的代码是要求把解压出来的文件放在当前目录下的 unzipped 文件夹里。
结论
在 Golang 中解压缩文件,我们可以使用标准库提供的 zip 包。使用该包中提供的函数,我们可以方便地读取压缩文件,并将其中的文件解压到指定的目录中。
极客笔记