2017-04-27 50 views

回答

3

我认为这可能对你有所帮助。 基本上,这个解决方案是从多个文件创建一个tarball。你必须简单地给你的文件的路径到位a.go和b.go等

package main 

import (
    "archive/tar" 
    "compress/gzip" 
    "io" 
    "log" 
    "os" 
) 

func addFile(tw *tar.Writer, path string) error { 
    file, err := os.Open(path) 
    if err != nil { 
     return err 
    } 
    defer file.Close() 
    if stat, err := file.Stat(); err == nil { 
     // now lets create the header as needed for this file within the tarball 
     header := new(tar.Header) 
     header.Name = path 
     header.Size = stat.Size() 
     header.Mode = int64(stat.Mode()) 
     header.ModTime = stat.ModTime() 
     // write the header to the tarball archive 
     if err := tw.WriteHeader(header); err != nil { 
      return err 
     } 
     // copy the file data to the tarball 
     if _, err := io.Copy(tw, file); err != nil { 
      return err 
     } 
    } 
    return nil 
} 

func main() { 
    // set up the output file 
    file, err := os.Create("output.tar.gz") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    defer file.Close() 
    // set up the gzip writer 
    gw := gzip.NewWriter(file) 
    defer gw.Close() 
    tw := tar.NewWriter(gw) 
    defer tw.Close() 
    // grab the paths that need to be added in 
    paths := []string{ 
     "a.go", 
     "b.go", 
    } 
    // add each file as needed into the current tar archive 
    for i := range paths { 
     if err := addFile(tw, paths[i]); err != nil { 
      log.Fatalln(err) 
     } 
    } 
} 
0

我认为它不会这样工作。 Gzip只包含一个文件,而tar是将许多文件序列化为一个文件的实用程序。因此这两个util一起使用。通常你可以把所有文件放到一个:

tar cvf file.tar primary/primary.txt secondary/second.wtf etc/other.file 

而且比你压缩用gzip

gzip file.tar 

这是好这个文件。但gzip可能只是一个文件。当然可以创建诸如primary/primary.tar之类的许多归档文件,然后再一次tar归档文件和gzip文件,但会有点混乱。