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

我正在尝试使用 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)

    }

}


当年话下
浏览 231回答 1
1回答

开满天机

您需要关闭底层的 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)    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go