How to implement "tar cvfz xxx.tar.gz " in golang?

huangapple go评论91阅读模式
英文:

How to implement "tar cvfz xxx.tar.gz " in golang?

问题

我想用Golang解压tar-gz文件。

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

英文:

I would like to decompress tar-gz file by golang.

> err := DecompressTarGz('xxx.tar.gz', '/Users/foobarbuzz/')

答案1

得分: 4

你可以使用compress/gziparchive/tar结合使用,或者使用os/exec直接调用tar和gzip,如果你不想在Go中实现所有这些功能。

英文:

Use compress/gzip in combination with archive/tar or use os/exec to call tar and gzip directly if you don't like to implement all of that in Go.

答案2

得分: 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)
}

这段代码是一个用于解压缩 tar.gz 文件的函数。它使用了 gziptar 包来实现解压缩功能。函数首先创建一个 gzip.Reader 对象来读取压缩文件,然后创建一个 tar.Reader 对象来读取 tar 文件。接下来,函数会遍历 tar 文件中的每个文件和目录,并根据其类型进行相应的处理。对于目录,函数会使用 os.MkdirAll 创建目录,并使用 setAttrs 函数设置目录的属性。对于文件,函数会创建一个新文件,并将 tar 文件中的内容复制到该文件中,然后同样使用 setAttrs 函数设置文件的属性。最后,函数返回可能出现的错误。

setAttrs 函数用于设置文件或目录的属性,包括权限和访问时间。它使用 os.Chmod 设置权限,使用 os.Chtimes 设置访问时间和修改时间。

希望这能帮到你!如果有任何问题,请随时问我。

英文:

I was looking for an answer to this one too. Implemented something that should work.

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)
}

huangapple
  • 本文由 发表于 2014年5月13日 18:44:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/23629080.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定