如何使用compress / gzip和archive / tar创建压缩的tar档案?

derferman:

我正在尝试使用Go标准库创建压缩的tar存档,特别是compress / gzip和archive / tar。我可以成功创建tar归档文件,但是当我尝试压缩所述归档文件时,无法解压缩生成的tarball。在OSX上,我收到“错误1-不允许进行操作”

要运行此代码,您将需要foo.txt在同一目录中命名一个文件

package main

import (
    "archive/tar"
    "bytes"
    "compress/gzip"
    "io/ioutil"
    "log"
    "os"
)

func main() {
    var b bytes.Buffer

    // Create a new zip archive.
    w := tar.NewWriter(gzip.NewWriter(&b))

    fi, err := os.Stat("foo.txt")

    if err != nil {
        log.Fatal(err)
    }

    header, err := tar.FileInfoHeader(fi, "")

    if err != nil {
        log.Fatal(err)
    }

    err = w.WriteHeader(header)

    if err != nil {
        log.Fatal(err)
    }

    contents, err := ioutil.ReadFile("foo.txt")

    if err != nil {
        log.Fatal(err)
    }

    _, err = w.Write(contents)

    if err != nil {
        log.Fatal(err)
    }

    err = w.Close()

    // Make sure to check the error on Close.
    err = ioutil.WriteFile("foo.tar.gz", b.Bytes(), 0666)

    if err != nil {
        log.Fatal(err)
    }
}
不可思议的:

您需要关闭基础gzip编写器,以确保可以将所有字节都刷新到文件中。像这样:

    // gzip writer
    gz := gzip.NewWriter(f)

    // Create a new tar archive.
    w := tar.NewWriter(gz)

    // add things to the tar archive
    // ...

    // make sure the gzip writer flushes any pending bytes
    if err = gz.Close(); err != nil {
            log.Fatal(err)
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章