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