使用golang解压带有文件夹的tgz文件

项目中需要做一个升级程序。因为该程序运行的平台种类比较多,比如有arm的,还有x86的,系统上有linux,还有windows的。因此做的时候要考虑的东西比较多。有一个事情,就是需要对下载的包进行解压缩。因为历史原因,包基本上采用tar.gz或者tgz格式。linux下这个问题,很好解决,直接调用tar去解压缩就可以了。但是windows地下,因为是win7的,所以系统自身是没有带着tar命令的。网上找资料,发现用golang去做一个解压缩的程序非常方便。因此,就直接照抄了一个。发现使用的时候,如果解压缩的tgz文件中没有文件夹,那么使用是没有问题的。如果压缩包中有文件夹,就有问题了。因为go语言是新手,最后又找了一圈资料,发现下面的代码是绝对可用的:

func Untar(tarball, target string) error {
	reader, err := os.Open(tarball)
	if err != nil {
		return err
	}
	defer reader.Close()
	tarReader := tar.NewReader(reader)

	for {
		header, err := tarReader.Next()
		if err == io.EOF {
			break
		} else if err != nil {
			return err
		}

		path := filepath.Join(target, header.Name)
		info := header.FileInfo()
		if info.IsDir() {
			if err = os.MkdirAll(path, info.Mode()); err != nil {
				return err
			}
			continue
		}

		file, err := os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, info.Mode())
		if err != nil {
			return err
		}
		defer file.Close()
		_, err = io.Copy(file, tarReader)
		if err != nil {
			return err
		}
	}
	return nil
}

与前面在csdn或者其它看到的大部分代码相比,差别就在

		path := filepath.Join(target, header.Name)
		info := header.FileInfo()
		if info.IsDir() {
			if err = os.MkdirAll(path, info.Mode()); err != nil {
				return err
			}
			continue
		}

即判断解压后的文件是文件还是文件夹,如果是文件夹,那么创建文件夹。然后continue,继续下一个文件或者文件夹的解压。其它的demo,有点不够严谨,直接io.Copy,就出问题了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值