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 压缩文件,创建读取器,并将解压后的内容复制到本地文件。