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"
)

func extractTarGz(filePath string, destDir string) error {
	// 打开压缩文件
	file, err := os.Open(filePath)
	if err != nil {
		return fmt.Errorf("failed to open file: %w", err)
	}
	defer file.Close()

	// 检查文件扩展名以确定是否需要解压缩
	var reader io.Reader = file
	switch ext := filepath.Ext(filePath); ext {
	case ".gz":
		gzf, err := gzip.NewReader(file)
		if err != nil {
			return fmt.Errorf("failed to create gzip reader: %w", err)
		}
		defer gzf.Close()
		reader = gzf
	default:
		if ext != ".tar" {
			return fmt.Errorf("unsupported file extension: %s", ext)
		}
	}

	// 创建tar读取器
	tarReader := tar.NewReader(reader)

	// 解压每个tar条目到目标目录
	for {
		header, err := tarReader.Next()
		if err == io.EOF {
			break
		} else if err != nil {
			return fmt.Errorf("failed to read tar header: %w", err)
		}

		targetPath := filepath.Join(destDir, header.Name)
		mode := header.FileInfo().Mode()

		switch header.Typeflag {
		case tar.TypeDir:
			if err := os.MkdirAll(targetPath, mode); err != nil {
				return fmt.Errorf("failed to create directory: %w", err)
			}
		case tar.TypeReg, tar.TypeRegA:
			outFile, err := os.OpenFile(targetPath, os.O_CREATE|os.O_WRONLY, mode)
			if err != nil {
				return fmt.Errorf("failed to create file: %w", err)
			}
			defer outFile.Close()

			if _, err := io.Copy(outFile, tarReader); err != nil {
				return fmt.Errorf("failed to write file content: %w", err)
			}
		default:
			fmt.Fprintf(os.Stderr, "Unsupported tar entry type: %v; skipping...\n", header.Typeflag)
		}
	}

	return nil
}

func main() {
	sourceFilePath := "archive.tar.gz"
	destDir := "output/"

	err := extractTarGz(sourceFilePath, destDir)
	if err != nil {
		fmt.Println("Error extracting tar.gz:", err)
	} else {
		fmt.Println("Tar.gz extraction successful.")
	}
}

这个示例定义了一个名为extractTarGz的函数,它接受一个.tar.tar.gz文件路径和一个目标解压目录作为参数。函数首先打开指定的文件,根据文件扩展名判断是否需要使用gzip.NewReader创建一个gzip解压器。接着,使用tar.NewReader创建一个tar读取器。

接下来,通过一个循环遍历tar文件中的每个条目。对于每个条目,根据其类型(如目录或文件)创建相应的文件系统对象,并将条目的内容写入目标位置。如果遇到不支持的条目类型,函数会打印一条警告消息并跳过该条目。

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

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值