如何在golang的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

我想创建一个tar文件,并在该tar文件中放置其他tar文件

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