go 压缩tar包

在Go语言中,可以使用标准库archive/tar配合其他库(如compress/gzipcompress/bzip2)来创建.tar.tar.gz.tar.bz2等类型的压缩包。以下是一个示例,演示如何创建一个包含若干文件和目录的.tar.tar.gz文件:

 

go

package main

import (
	"archive/tar"
	"compress/gzip"
	"fmt"
	"io"
	"os"
	"path/filepath"
)

func createTarGz(sourceDir string, destFilePath string) error {
	// 创建目标文件并准备gzip写入器
	file, err := os.Create(destFilePath)
	if err != nil {
		return fmt.Errorf("failed to create output file: %w", err)
	}
	defer file.Close()

	gzw := gzip.NewWriter(file)
	defer gzw.Close()

	tw := tar.NewWriter(gzw)
	defer tw.Close()

	// 遍历源目录下的文件和子目录
	err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return fmt.Errorf("error walking path %q: %w", path, err)
		}

		// 跳过源目录本身
		if path == sourceDir {
			return nil
		}

		header, err := tar.FileInfoHeader(info, "")
		if err != nil {
			return fmt.Errorf("failed to create tar header for %q: %w", path, err)
		}

		// 修正相对路径
		header.Name = strings.TrimPrefix(path, sourceDir+string(os.PathSeparator))

		if err := tw.WriteHeader(header); err != nil {
			return fmt.Errorf("failed to write tar header for %q: %w", path, err)
		}

		if !info.IsDir() {
			file, err := os.Open(path)
			if err != nil {
				return fmt.Errorf("failed to open file %q: %w", path, err)
			}
			defer file.Close()

			if _, err := io.Copy(tw, file); err != nil {
				return fmt.Errorf("failed to copy file content for %q: %w", path, err)
			}
		}

		return nil
	})

	if err != nil {
		return fmt.Errorf("error creating tar archive: %w", err)
	}

	return nil
}

func main() {
	sourceDir := "source/"
	destFilePath := "archive.tar.gz"

	err := createTarGz(sourceDir, destFilePath)
	if err != nil {
		fmt.Println("Error creating tar.gz:", err)
	} else {
		fmt.Println("Tar.gz creation successful.")
	}
}

这个示例定义了一个名为createTarGz的函数,它接受一个源目录路径和一个目标.tar.gz文件路径作为参数。函数首先创建目标文件并准备好gzip写入器,再在gzip写入器之上创建tar写入器。

接着,使用filepath.Walk遍历源目录及其所有子目录和文件。对于每个文件或目录,创建相应的tar.Header,并根据相对源目录的路径修正其名称。然后,向tar写入器写入头信息。对于文件,还需要打开文件并将其内容复制到tar写入器。

main函数中,调用createTarGz函数处理指定的源目录,并将压缩结果保存到指定的.tar.gz文件。如果压缩过程中发生错误,程序将打印错误信息;否则,显示压缩成功的消息。

这个示例涵盖了基本的.tar.tar.gz文件创建逻辑。在实际使用时,可以根据需要进行错误处理、权限设置等方面的优化。如果要创建.tar.bz2文件,只需替换为使用compress/bzip2库并相应调整压缩逻辑即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值