golang gzip 压缩目录

发布时间:2024-07-05 00:15:28

gzip 是一种常用的文件压缩格式,在 Golang 中有两个包提供了对目录进行 gzip 压缩的功能。本文将介绍如何使用这两个包分别对目录进行压缩,让你的应用能够在网络传输或者存储时更加高效。

使用 compress/gzip 包

Golang 的标准库中提供了 compress/gzip 包,可以直接使用该包来压缩目录。下面是一个示例代码:

package main

import (
    "archive/zip"
    "bufio"
    "fmt"
    "io"
    "os"
    "path/filepath"
)

func main() {
    inputDir := "./input"
    outputDir := "./output"

    err := os.MkdirAll(outputDir, 0755)
    if err != nil {
        fmt.Println("Failed to create output directory:", err)
        return
    }

    outputFile, err := os.Create(filepath.Join(outputDir, "output.zip"))
    if err != nil {
        fmt.Println("Failed to create output file:", err)
        return
    }
    defer outputFile.Close()

    zipWriter := zip.NewWriter(outputFile)
    defer zipWriter.Close()

    filepath.Walk(inputDir, 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 = filepath.Join(outputDir, path[len(inputDir):])

        if info.IsDir() {
            header.Name += "/"
        } else {
            header.Method = zip.Deflate
        }

        writer, err := zipWriter.CreateHeader(header)
        if err != nil {
            return err
        }

        if info.IsDir() {
            return nil
        }

        file, err := os.Open(path)
        if err != nil {
            return err
        }
        defer file.Close()

        _, err = io.Copy(writer, bufio.NewReader(file))
        if err != nil {
            return err
        }

        return nil
    })

    fmt.Println("Directory successfully compressed to output.zip")
}

使用 github.com/mholt/archiver 包

除了标准库中的 compress/gzip 包,github.com/mholt/archiver 包也提供了对目录进行 gzip 压缩的功能。下面是一个示例代码:

package main

import (
    "fmt"

    "github.com/mholt/archiver/v3"
)

func main() {
    inputDir := "./input"
    outputDir := "./output"

    err := archiver.Gzip.Make(filepath.Join(outputDir, "output.tar.gz"), []string{inputDir})
    if err != nil {
        fmt.Println("Failed to compress directory:", err)
        return
    }

    fmt.Println("Directory successfully compressed to output.tar.gz")
}

两种方式的对比

以上两种方式都可以对目录进行 gzip 压缩,但使用 compress/gzip 包需要手动处理每个文件和目录的压缩细节,而使用 github.com/mholt/archiver 包则更加简单,只需要一行代码就可以完成整个压缩过程。

虽然 github.com/mholt/archiver 包更加便捷,但它可能会引入额外的依赖,需要进行相关的安装或者引入模块。而 compress/gzip 包是标准库中的一部分,无需额外的安装或者依赖管理。

根据具体的使用场景和个人偏好,你可以选择适合自己的压缩方式。不管采用哪种方式,gzip 压缩目录都能提供更高效的网络传输和存储,为你的应用性能优化带来巨大的好处。

相关推荐