如何在golang中实现“tar cvfz xxx.tar.gz”?

时间:2014-05-13 10:44:56

标签: go gzip tar

我想通过golang解压缩tar-gz文件。

  

错误:= DecompressTarGz('xxx.tar.gz','/ Users / foobarbuzz /')

2 个答案:

答案 0 :(得分:4)

compress/gziparchive/tar结合使用,或使用os/exec直接调用tar和gzip,如果您不想在Go中实现所有这些内容。

答案 1 :(得分:2)

我也在寻找这个问题的答案。实施了应该有用的东西。

func Decompress(targetdir string, reader io.ReadCloser) error {
    gzReader, err := gzip.NewReader(reader)
    if err != nil {
        return err
    }
    defer gzReader.Close()

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

        target := path.Join(targetdir, header.Name)
        switch header.Typeflag {
        case tar.TypeDir:
            err = os.MkdirAll(target, os.FileMode(header.Mode))
            if err != nil {
                return err
            }

            setAttrs(target, header)
            break

        case tar.TypeReg:
            w, err := os.Create(target)
            if err != nil {
                return err
            }
            _, err = io.Copy(w, tarReader)
            if err != nil {
                return err
            }
            w.Close()

            setAttrs(target, header)
            break

        default:
            log.Printf("unsupported type: %v", header.Typeflag)
            break
        }
    }

    return nil
}

func setAttrs(target string, header *tar.Header) {
    os.Chmod(target, os.FileMode(header.Mode))
    os.Chtimes(target, header.AccessTime, header.ModTime)
}