2013-12-08 110 views
3

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

要运行此代码,您需要在同一目录中有一个名为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) 
    } 
} 

回答

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) 
    } 
相关问题