在Golang中压缩文件
在日常的程序设计中,文件压缩是非常常见的操作,常见的压缩格式有zip、gzip等。Golang作为一门现代编程语言,自带了标准库,其中也自带了压缩文件的库。在本文中,我们将介绍如何使用Golang进行文件压缩。
zip压缩文件
Golang中自带的archive/zip包提供了很方便的API进行文件压缩和解压缩。下面是一个zip压缩文件的示例代码,其中main函数启动的时候从命令行接收一个文件夹作为参数,并将其压缩为zip文件:
package main
import (
"archive/zip"
"fmt"
"io"
"os"
"path/filepath"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Please provide the path to compress.")
return
}
sourcePath := os.Args[1]
zipFile, err := os.Create(sourcePath + ".zip")
if err != nil {
fmt.Println(err)
return
}
defer zipFile.Close()
archive := zip.NewWriter(zipFile)
defer archive.Close()
filepath.Walk(sourcePath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Name = path
if info.IsDir() {
header.Name += "/"
} else {
header.Method = zip.Deflate
}
writer, err := archive.CreateHeader(header)
if err != nil {
return err
}
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
_, err = io.Copy(writer, file)
if err != nil {
return err
}
}
return nil
})
fmt.Println("Compressed successfully.")
}
上面的代码中,我们首先判断命令行参数是否正确,创建要压缩的zip文件,创建一个Zip文件写入器,然后遍历要压缩的文件夹,创建Zip文件头,然后将文件内容写入到Zip当中,最后返回出错结果。
gzip压缩文件
gzip压缩是Golang标准库中另一个常见的压缩方式。下面的示例代码将读取一个文件并将其压缩为gzip文件。
package main
import (
"compress/gzip"
"fmt"
"io"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Please provide the file to compress.")
return
}
sourcePath := os.Args[1]
sourceFile, err := os.Open(sourcePath)
if err != nil {
fmt.Println(err)
return
}
defer sourceFile.Close()
gzipFile, err := os.Create(sourcePath + ".gz")
if err != nil {
fmt.Println(err)
return
}
defer gzipFile.Close()
writer := gzip.NewWriter(gzipFile)
_, err = io.Copy(writer, sourceFile)
if err != nil {
fmt.Println(err)
return
}
err = writer.Close()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Compressed successfully.")
}
上面的代码中,我们同样判断命令行参数是否正确,把指定的文件读取进来,然后创建压缩文件,创建gzip压缩器,将文件内容复制到gzip压缩器中进行压缩,最后关闭写入器返回出错结果。
解压缩文件
解压缩也是文件操作中常见的一项,archive/zip和compress/gzip两个库也都含有解压缩的函数。下面是一个解压缩zip文件的示例代码:
package main
import (
"archive/zip"
"fmt"
"io"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Please provide the zip file to extract.")
return
}
zipPath := os.Args[1]
reader, err := zip.OpenReader(zipPath)
if err != nil {
fmt.Println(err)
return
}
defer reader.Close()
for _, file := range reader.File {
destPath := filepath.Join(".", file.Name)
if file.FileInfo().IsDir() {
os.MkdirAll(destPath, file.Mode())
continue
}
destFile, err := os.Create(destPath)
if err != nil {
fmt.Println(err)
return
}
defer destFile.Close()
sourceFile, err := file.Open()
if err != nil {
fmt.Println(err)
return
}
defer sourceFile.Close()
_, err = io.Copy(destFile, sourceFile)
if err != nil {
fmt.Println(err)
return
}
}
fmt.Println("Extracted successfully.")
}
上面的代码中,我们同样判断命令行参数是否正确,打开zip文件并读取其中的文件。如果是一个文件夹,创建一个同名文件夹,如果是一个文件,创建一个同名文件并将文件内容写到该文件中。
结论
在Golang中,我们通过标准库中的archive/zip和compress/gzip库,可以很方便地进行文件的压缩和解压缩。无论是zip压缩还是gzip压缩,我们都可以使用相对简单的代码实现,并且在实现过程中可以利用Golang的并发处理能力,提高程序的效率,也让Golang成为处理文件及其压缩的不二选择。