项目中需要做一个升级程序。因为该程序运行的平台种类比较多,比如有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,就出问题了。