在Golang中压缩文件

在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成为处理文件及其压缩的不二选择。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Go 教程