Golang:将文件追加到现有的tar归档文件中

如何在Go中将文件附加到现有的tar存档中?我没有在文档中看到任何明显的方法。

我有一个已经创建的tar文件,在关闭它之后,我想向它添加更多文件。

更改文档中的示例并遵循给出的答案,我仍然没有得到预期的结果。前三个文件正在写入tar,但是当我再次关闭并打开文件以对其进行写入时,永远不会写入新文件。代码运行正常。我不知道我在想什么。

以下代码为我提供了一个tar文件,其中包含三个文件:readme.txt,gopher.txt,todo.txt。foo.bar永远不会被写入。

package main

import (

"archive/tar"

"log"

"os"

)

func main() {

f, err := os.Create("/home/jeff/Desktop/test.tar")

if err != nil {

log.Fatalln(err)

}

tw := tar.NewWriter(f)

var files = []struct {

Name, Body string

}{

{"readme.txt", "This archive contains some text files."},

{"gopher.txt", "Gopher names:\nGeorge\nGeoffrey\nGonzo"},

{"todo.txt", "Get animal handling licence."},

}

for _, file := range files {

hdr := &tar.Header{

Name: file.Name,

Size: int64(len(file.Body)),

}

if err := tw.WriteHeader(hdr); err != nil {

log.Fatalln(err)

}

if _, err := tw.Write([]byte(file.Body)); err != nil {

log.Fatalln(err)

}

}

if err := tw.Close(); err != nil {

log.Fatalln(err)

}

f.Close()

// Open up the file and append more things to it

f, err = os.OpenFile("/home/jeff/Desktop/test.tar", os.O_APPEND|os.O_WRONLY, os.ModePerm)

if err != nil {

log.Fatalln(err)

}

tw = tar.NewWriter(f)

test := "this is a test"

hdr := &tar.Header{

Name: "foo.bar",

Size: int64(len(test)),

}

if err := tw.WriteHeader(hdr); err != nil {

log.Fatalln(err)

}

if _, err := tw.Write([]byte(test)); err != nil {

log.Fatalln(err)

}

if err := tw.Close(); err != nil {

log.Fatalln(err)

}

f.Close()

}

回答:

tar文件规范状态:

tar归档文件由一系列512字节的记录组成。每个文件系统对象都需要一个标头记录,该记录存储基本元数据(路径名,所有者,权限等)以及零个或多个包含任何文件数据的记录。归档的末尾由两个完全由零字节组成的记录指示。

添加这两个零填充记录的Go实现在此处进行。

要绕开tar文件格式预告片(基本上是1024个字节,什么也没有),您可以替换以下行:

f, err = os.OpenFile("/home/jeff/Desktop/test.tar", os.O_APPEND|os.O_WRONLY, os.ModePerm)

if err != nil {

log.Fatalln(err)

}

tw = tar.NewWriter(f)

带有:

f, err = os.OpenFile("/home/jeff/Desktop/test.tar", os.O_RDWR, os.ModePerm)

if err != nil {

log.Fatalln(err)

}

if _, err = f.Seek(-1024, os.SEEK_END); err != nil {

log.Fatalln(err)

}

tw = tar.NewWriter(f)

它打开文件读/写(而不是附加/只写),然后在文件末尾查找1024个字节并从那里写。

它可以工作, 但这 一个可怕的骇客。

编辑:tar更好地了解文件规范后,我不再相信这是一个hack。

完整代码:http://play.golang.org/p/0zRScmY4AC

以上是 Golang:将文件追加到现有的tar归档文件中 的全部内容, 来源链接: utcz.com/qa/424832.html

回到顶部