当前位置: 首页 > 面试题库 >

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

司马萧迟
2023-03-14
问题内容

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



 类似资料:
  • 我阅读了如何在java中将文件附加到tar存档?,将文件附加到存档而无需读取/重写整个存档,并在不覆盖其现有内容的情况下将条目添加到tar文件,但没有给出好的答案。此外,我没有足够的声誉来发表评论。所以我在这里创建了一个新问题。 有没有办法将文件附加到tar存档中?如果文件已经存在,我想替换它。 我已经开始编写下面的方法,但是当添加文件时,它会删除存档内容。我在apache compress网站上

  • 本文向大家介绍Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法,包括了Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Python3程序设计有所帮助。

  • 问题内容: 我发现os.Open()返回O_RDONLY文件,而os.Create()返回O_RDWR,但是找不到方法返回APPEND文件指针。 有什么帮助吗? 问题答案: 该OpenFile需要一个标志参数,您可以使用: 与O_CREATE一起使用,OpenFile还可以起到与os.Create()相同的作用。

  • 在我的用例中,我需要一个find a way将键/值对追加到现有序列文件中。怎么做?任何线索都会大有帮助。我正在使用Hadoop2X。

  • 问题内容: 我们可以创建一个zip新文件并使用Go Language添加文件。 但是,如何使用GoLang使用现有的zip文件添加新文件? 如果可以使用Create函数,如何获取zip.writer参考? 有点困惑。 问题答案: 经过更多分析,我发现无法使用现有的zip文件添加任何文件。 但是,通过遵循此URL中提供的技巧,我能够使用tar文件添加文件。