55、Go语言基础 - 文件压缩 - 解压缩

作者: 温新

分类: 【Go基础】

阅读: 333

时间: 2023-12-05 00:47:53

hi,我是温新

Go 语言标准库中有一个 archive 包,但它实际上是一个包含多种归档文件格式的通用包。这个包位于 archive/ziparchive/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/zipfmtos
  • 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/zipfmtioos

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

请登录后再评论