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

3

我正在尝试使用Go标准库(具体来说是compress/gzip和archive/tar)创建一个压缩的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个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接