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

时间:2013-12-08 22:09:19

标签: go

我正在尝试使用Go标准库创建压缩的tar存档,特别是压缩/ 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)
    }
}

1 个答案:

答案 0 :(得分:6)

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