如何在Golang中将一个tar文件放入另一个tar文件中

huangapple go评论93阅读模式
英文:

How can I put a tar file inside tar file in golang

问题

你好!你可以使用Go语言来创建一个tar文件,并在其中放置其他的tar文件。下面是一个示例代码,可以实现你所描述的层次结构:

package main

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

func main() {
	// 创建一个名为TopLevelTar.tar.gz的文件
	file, err := os.Create("TopLevelTar.tar.gz")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// 创建一个gzip.Writer,用于写入tar文件
	gw := gzip.NewWriter(file)
	defer gw.Close()

	// 创建一个tar.Writer,用于写入文件和目录
	tw := tar.NewWriter(gw)
	defer tw.Close()

	// 添加primary目录及其内容到tar文件中
	addFileToTar(tw, "primary/primary.tar", "primary/primary.tar")

	// 添加secondary目录及其内容到tar文件中
	addFileToTar(tw, "secondary/secondary.tar", "secondary/secondary.tar")

	// 添加tertiary目录及其内容到tar文件中
	addFileToTar(tw, "tertiary/tertiary.tar", "tertiary/tertiary.tar")

	log.Println("Tar file created successfully.")
}

// 将文件添加到tar文件中
func addFileToTar(tw *tar.Writer, filePath, tarPath string) {
	file, err := os.Open(filePath)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// 获取文件信息
	info, err := file.Stat()
	if err != nil {
		log.Fatal(err)
	}

	// 创建一个tar.Header,用于描述文件信息
	header := &tar.Header{
		Name: tarPath,
		Mode: int64(info.Mode()),
		Size: info.Size(),
	}

	// 将header写入tar文件
	if err := tw.WriteHeader(header); err != nil {
		log.Fatal(err)
	}

	// 将文件内容写入tar文件
	if _, err := io.Copy(tw, file); err != nil {
		log.Fatal(err)
	}
}

你可以根据需要修改文件路径和名称,然后运行这段代码来创建你所需的tar文件。希望对你有帮助!

英文:

I want to create a tar file and inside that tar file I want to put other tar files.Hierarchy is something like

TopLevelTar.tar.gz
|-->primary/primary.tar
|-->secondary/secondaty.tar
|-->tertiary/tertiary.tar

How can I do it in golag?

答案1

得分: 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 {
		// 现在让我们根据需要为tarball中的此文件创建头部
		header := new(tar.Header)
		header.Name = path
		header.Size = stat.Size()
		header.Mode = int64(stat.Mode())
		header.ModTime = stat.ModTime()
		// 将头部写入tarball存档
		if err := tw.WriteHeader(header); err != nil {
			return err
		}
		// 将文件数据复制到tarball
		if _, err := io.Copy(tw, file); err != nil {
			return err
		}
	}
	return nil
}

func main() {
	// 设置输出文件
	file, err := os.Create("output.tar.gz")
	if err != nil {
		log.Fatalln(err)
	}
	defer file.Close()
	// 设置gzip写入器
	gw := gzip.NewWriter(file)
	defer gw.Close()
	tw := tar.NewWriter(gw)
	defer tw.Close()
	// 获取需要添加的路径
	paths := []string{
		"a.go",
		"b.go",
	}
	// 根据需要将每个文件添加到当前tar存档中
	for i := range paths {
		if err := addFile(tw, paths[i]); err != nil {
			log.Fatalln(err)
		}
	}
}
英文:

I think this might help you.
Basically, this solution is creating a tarball from multiple files. You have to simply give path of your files in place of a.go and b.go etc.

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

答案2

得分: 0

我认为这样行不通。Gzip只包含一个文件,而tar是将多个文件序列化为一个文件的实用工具。因此,这两个工具通常一起使用。通常,您可以将所有文件放入一个文件中:

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

然后,您可以使用gzip对该文件进行压缩:

gzip file.tar

这样是可以的。但是,gzip压缩后只会生成一个文件。当然,您可以创建多个类似primary/primary.tar的归档文件,然后再将它们一起打包成tar文件,并在此之后再使用gzip进行压缩,但这可能会有点混乱。

英文:

I think it won't work this way. Gzip contains just one file, and tar is utility that serialize many file into one. Therefore those two util are used together. Usually you can put all files into one:

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

And than you compress this file with gzip

gzip file.tar

It is okey. But gzipped could be just one file. Of course is possible to create many archives like primary/primary.tar and again tar archives together and gzip after it, but would be a bit confusing.

huangapple
  • 本文由 发表于 2017年4月27日 12:57:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/43648960.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定