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