我想创建一个tar文件和tar文件我希望把其他焦油files.Hierarchy里面是一样的东西我怎样才能把一个tar文件tar文件里面golang
TopLevelTar.tar.gz
|-->primary/primary.tar
|-->secondary/secondaty.tar
|-->tertiary/tertiary.tar
我该怎么办它在golag?
我想创建一个tar文件和tar文件我希望把其他焦油files.Hierarchy里面是一样的东西我怎样才能把一个tar文件tar文件里面golang
TopLevelTar.tar.gz
|-->primary/primary.tar
|-->secondary/secondaty.tar
|-->tertiary/tertiary.tar
我该怎么办它在golag?
我认为这可能对你有所帮助。 基本上,这个解决方案是从多个文件创建一个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)
}
}
}
我认为它不会这样工作。 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文件,但会有点混乱。