55、Go语言基础 - 文件压缩 - 解压缩
hi,我是温新
Go 语言标准库中有一个 archive
包,但它实际上是一个包含多种归档文件格式的通用包。这个包位于 archive/zip
、archive/tar
等子包中,而不是直接使用 archive
archive/zip
archive/zip
包提供了对 ZIP 归档文件格式的读写支持。可以使用它来创建 ZIP 文件或解压缩 ZIP 归档文件。
其常用函数和类型如下:
-
Create
方法:创建一个新的 ZIP 文件。 -
Open
方法:打开一个已存在的 ZIP 文件。 -
File
类型:表示 ZIP 文件中的一个文件。 -
NewWriter
函数:创建一个 ZIP 归档文件的写入器。
archive/tar
archive/tar
包提供了对 TAR 归档文件格式的读写支持。TAR 归档文件通常用于将多个文件和目录打包成一个文件。该包包含了处理 TAR 文件的函数和类型。
常用函数和类型:
-
NewReader
函数:创建一个 TAR 归档文件的读取器。 -
NewWriter
函数:创建一个 TAR 归档文件的写入器。 -
Reader
类型:用于读取 TAR 文件。 -
Writer
类型:用于写入 TAR 文件。
zip 案例
打包
package main
import (
"archive/zip"
"fmt"
"os"
)
func main() {
// 创建一个名为 "example.zip" 的 ZIP 归档文件
zipFile, err := os.Create("../mydir1/son.zip")
if err != nil {
fmt.Println("无法创建 ZIP 文件:", err)
return
}
defer zipFile.Close()
// 创建一个 ZIP 归档文件写入器
zipWriter := zip.NewWriter(zipFile)
// 添加文件到 ZIP 归档文件
addFileToZip(zipWriter, "file1.txt", []byte("这是文件1的内容"))
addFileToZip(zipWriter, "file2.txt", []byte("这是文件2的内容"))
// 关闭 ZIP 归档文件写入器,完成 ZIP 文件的创建
err = zipWriter.Close()
if err != nil {
fmt.Println("无法关闭 ZIP 写入器:", err)
}
}
// addFileToZip 将文件内容添加到 ZIP 归档文件中
func addFileToZip(zipWriter *zip.Writer, filename string, content []byte) {
// 创建一个文件头
fileHeader := &zip.FileHeader{
Name: filename,
Method: zip.Deflate,
}
// 将文件头写入 ZIP 归档文件
fileWriter, err := zipWriter.CreateHeader(fileHeader)
if err != nil {
fmt.Println("无法创建 ZIP 文件头:", err)
return
}
// 将文件内容写入 ZIP 归档文件
_, err = fileWriter.Write(content)
if err != nil {
fmt.Println("无法写入 ZIP 文件内容:", err)
}
fmt.Println("打包成功")
}
这个示例演示了如何使用 archive/zip
包创建 ZIP 归档文件,添加文件,并将文件内容写入 ZIP 文件。
代码解释:
- 我们首先导入了所需的包,包括
archive/zip
、fmt
和os
。 - 在
main
函数中,我们创建一个名为 "example.zip" 的 ZIP 归档文件,使用os.Create
函数。然后,我们使用defer
关键字确保在程序结束时关闭 ZIP 文件。 - 创建 ZIP 归档文件的写入器,使用
zip.NewWriter
函数创建一个zip.Writer
实例。 - 使用
addFileToZip
函数向 ZIP 归档文件中添加两个文件,分别是 "file1.txt" 和 "file2.txt"。每个文件都有一些示例内容。 - 最后,我们关闭 ZIP 归档文件写入器,这一步非常重要,它会完成 ZIP 文件的创建。
-
addFileToZip
函数负责将文件内容添加到 ZIP 归档文件中。它创建一个zip.FileHeader
表示文件头,然后将文件头和文件内容写入 ZIP 文件。
解包
package main
import (
"archive/zip"
"fmt"
"io"
"os"
)
func main() {
// 打开一个名为 "son.zip" 的 ZIP 归档文件
zipFile, err := zip.OpenReader("../mydir1/son.zip")
if err != nil {
fmt.Println("无法打开 ZIP 文件:", err)
return
}
defer zipFile.Close()
// 遍历 ZIP 归档文件中的文件
for _, file := range zipFile.File {
// 打开 ZIP 归档文件中的文件
zipEntry, err := file.Open()
if err != nil {
fmt.Println("无法打开 ZIP 文件中的文件:", err)
continue
}
defer zipEntry.Close()
// 创建本地文件,用于保存 ZIP 文件中的内容
localFile, err := os.Create(file.Name)
if err != nil {
fmt.Println("无法创建本地文件:", err)
continue
}
defer localFile.Close()
// 复制 ZIP 文件中的内容到本地文件
_, err = io.Copy(localFile, zipEntry)
if err != nil {
fmt.Println("无法复制文件内容:", err)
continue
}
}
}
这个示例演示了如何使用 archive/zip
包打开 ZIP 归档文件,遍历其中的文件,以及将文件内容复制到本地文件,以解包 ZIP 归档文件。
代码解释:
-
我们首先导入了所需的包,包括
archive/zip
、fmt
、io
和os
。 -
在
main
函数中,我们使用zip.OpenReader
函数打开名为 "example.zip" 的 ZIP 归档文件。然后,我们使用defer
关键字确保在程序结束时关闭 ZIP 文件。 -
使用
zipFile.File
遍历 ZIP 归档文件中的所有文件。 -
对于每个文件,我们使用
file.Open
打开 ZIP 归档文件中的文件,这将返回一个读取器。使用defer
关键字确保在使用完后关闭。 -
创建本地文件,用于保存 ZIP 文件中的内容。我们使用
os.Create
函数创建文件,并将文件名设置为 ZIP 归档文件中的文件名。同样,使用defer
关键字确保在使用完后关闭。 -
使用
io.Copy
函数将 ZIP 文件中的内容复制到本地文件。这会将 ZIP 文件中的内容复制到本地文件,以解包 ZIP 归档文件。
gzip 案例
压缩
package main
import (
"compress/gzip"
"fmt"
"os"
)
func main() {
// 创建一个 gzip 压缩文件
gzipFile, err := os.Create("wangmeili.gz")
if err != nil {
fmt.Println("无法创建 GZIP 文件:", err)
return
}
defer gzipFile.Close()
// 创建 gzip 压缩文件写入器
gzipWriter := gzip.NewWriter(gzipFile)
// 写入内容到 gzip 压缩文件
content := "王美丽正在学习 Go"
_, err = gzipWriter.Write([]byte(content))
if err != nil {
fmt.Println("无法写入内容到 GZIP 文件:", err)
return
}
// 关闭 GZIP 压缩文件写入器,完成压缩文件的创建
err = gzipWriter.Close()
if err != nil {
fmt.Println("无法关闭 GZIP 写入器:", err)
}
fmt.Println("压缩成功")
}
这个示例演示了如何使用 compress/gzip
包的 NewWriter
方法创建 GZIP 压缩文件,将内容写入文件,并最终完成压缩文件的创建
代码解释:
- 首先导入了所需的包,包括
compress/gzip
、fmt
和os
。 - 在
main
函数中,我们使用os.Create
函数创建一个名为 "example.gz" 的 GZIP 压缩文件。然后,我们使用defer
关键字确保在程序结束时关闭 GZIP 文件。 - 使用
gzip.NewWriter
函数创建 GZIP 压缩文件的写入器,返回一个*gzip.Writer
实例。 - 我们定义要写入的内容,这里是一个简单的字符串。
- 使用
gzipWriter.Write
方法将内容写入 GZIP 压缩文件。这会将内容压缩并写入 GZIP 文件中。 - 最后,我们使用
gzipWriter.Close
方法关闭 GZIP 压缩文件写入器,这一步非常重要,它会完成压缩文件的创建。
解压
package main
import (
"compress/gzip"
"fmt"
"io"
"os"
)
func main() {
// 打开一个 GZIP 压缩文件
gzipFile, err := os.Open("wangmeili.gz")
if err != nil {
fmt.Println("无法打开 GZIP 文件:", err)
return
}
defer gzipFile.Close()
// 创建 GZIP 压缩文件的读取器
gzipReader, err := gzip.NewReader(gzipFile)
if err != nil {
fmt.Println("无法创建 GZIP 读取器:", err)
return
}
defer gzipReader.Close()
// 创建本地文件,用于保存解压后的内容
localFile, err := os.Create("wangmeli.txt")
if err != nil {
fmt.Println("无法创建本地文件:", err)
return
}
defer localFile.Close()
// 复制解压后的内容到本地文件
_, err = io.Copy(localFile, gzipReader)
if err != nil {
fmt.Println("无法复制解压后的内容:", err)
}
fmt.Println("解压成功")
}
这个示例演示了如何使用 compress/gzip
包来打开 GZIP 压缩文件,创建读取器,并将解压后的内容复制到本地文件。