在Go语言中,可以使用标准库中的"compress/gzip"和"io/ioutil"包来实现数据的压缩和解压缩。下面是一个简单的示例,展示了如何使用这些包进行ZIP文件的压缩和解压缩。
- 导入所需的包:
import ( "archive/zip" "compress/gzip" "io/ioutil" "log" )
- 压缩文件:
func compressFile(sourcePath, destinationPath string) error {
// 打开源文件
sourceFile, err := os.Open(sourcePath)
if err != nil {
return err
}
defer sourceFile.Close()
// 创建一个新的ZIP文件
destinationFile, err := os.Create(destinationPath)
if err != nil {
return err
}
defer destinationFile.Close()
// 创建一个ZIP writer
zipWriter := zip.NewWriter(destinationFile)
defer zipWriter.Close()
// 将源文件添加到ZIP文件中
fileToZip, err := os.Open(sourcePath)
if err != nil {
return err
}
defer fileToZip.Close()
info, err := fileToZip.Stat()
if err != nil {
return err
}
header, err := zip.FileInfoHeader(info)
if err != nil {
return err
}
header.Method = zip.Deflate
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return err
}
_, err = io.Copy(writer, fileToZip)
if err != nil {
return err
}
return nil
}
- 解压缩文件:
func decompressFile(zipPath, destinationPath string) error {
// 打开ZIP文件
zipFile, err := zip.OpenReader(zipPath)
if err != nil {
return err
}
defer zipFile.Close()
for _, file := range zipFile.File {
// 创建目标文件
destinationFile, err := os.Create(filepath.Join(destinationPath, file.Name))
if err != nil {
return err
}
defer destinationFile.Close()
// 解压缩文件到目标文件
reader, err := file.Open()
if err != nil {
return err
}
defer reader.Close()
_, err = io.Copy(destinationFile, reader)
if err != nil {
return err
}
}
return nil
}
- 使用示例:
func main() { sourcePath := "example.txt" destinationPath := "example.zip" // 压缩文件 err := compressFile(sourcePath, destinationPath) if err != nil { log.Fatalf("Error compressing file: %v", err) } // 解压缩文件 err = decompressFile(destinationPath, "extracted") if err != nil { log.Fatalf("Error decompressing file: %v", err) } }
这个示例展示了如何使用Go语言的标准库进行ZIP文件的压缩和解压缩。你可以根据需要修改这些函数以适应其他压缩格式。