为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
当年话下 2021-07-09 14:02:04
我正在尝试使用 Go 标准库创建压缩的 tar 存档,特别是 compress/gzip 和 archive/tar。我可以成功创建一个 tar 存档,但是当我尝试压缩所述存档时,无法解压缩生成的 tarball。在 OSX 上,我收到“错误 1 - 不允许操作”要运行此代码,您需要一个foo.txt在同一目录中命名的文件。package mainimport (    "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)    }}
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

您需要关闭底层的 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)

    }


查看完整回答
反对 回复 2021-07-12
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信