如何在golang的tar文件中放入tar文件
我想创建一个tar文件,并在该tar文件中放置其他tar文件如何在golang的tar文件中放入tar文件,go,Go,我想创建一个tar文件,并在该tar文件中放置其他tar文件 TopLevelTar.tar.gz |-->primary/primary.tar |-->secondary/secondaty.tar |-->tertiary/tertiary.tar 在golag我怎么做呢?我想这样不行。Gzip只包含一个文件,而tar是将多个文件序列化为一个文件的实用工具。因此,这两个util一起使用。通常,您可以将所有文件放在一个文件中: tar cvf fi
TopLevelTar.tar.gz
|-->primary/primary.tar
|-->secondary/secondaty.tar
|-->tertiary/tertiary.tar
在golag我怎么做呢?我想这样不行。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,但这会有点混乱。我认为这可能会对您有所帮助。 基本上,这个解决方案是从多个文件创建一个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)
}
}
}