如何使用Golang将文件添加到现有的zip文件中

时间:2015-02-14 07:26:58

标签: go zip

我们可以使用Go语言创建一个zip新文件并添加文件。

但是,如何使用GoLang添加带有现有zip文件的新文件?

如果我们可以使用Create函数,如何获取zip.writer引用?

有点困惑。

4 个答案:

答案 0 :(得分:3)

经过更多分析后,我发现,无法使用现有的zip文件添加任何文件。

但是,我可以通过跟踪this网址中提供的黑客来添加带有tar文件的文件。

答案 1 :(得分:0)

尽管我还没有尝试过使用已经存在的zip文件进行写入,但是我相信您应该能够向其中添加文件。

这是我编写的用于创建包含多个文件的大型zip文件的代码,以加快将数据上传到另一个位置的速度。希望对您有所帮助!

type fileData struct {
    Filename string
    Body     []byte
}

func main() {
    outputFilename := "path/to/file.zip"

    // whatever you want as filenames and bodies
    fileDatas := createFileDatas()

    // create zip file
    conglomerateZip, err := os.Create(outputFilename)
    if err != nil {
        return err
    }
    defer conglomerateZip.Close()

    zipWriter := zip.NewWriter(conglomerateZip)
    defer zipWriter.Close()

    // populate zip file with multiple files
    err = populateZipfile(zipWriter, fileDatas)
    if err != nil {
        return err
    }

}

func populateZipfile(w *zip.Writer, fileDatas []*fileData) error {
    for _, fd := range fileDatas {
        f, err := w.Create(fd.Filename)
        if err != nil {
            return err
        }

        _, err = f.Write([]byte(fd.Body))
        if err != nil {
            return err
        }

        err = w.Flush()
        if err != nil {
            return err
        }
    }
    return nil
}

答案 2 :(得分:0)

这有点陈旧并且已经有了答案,但是如果性能不是您的主要问题(例如使zip文件不在热门路径上),您可以 通过创建新的编写器并将现有文件复制到其中,然后添加新内容,将其与归档/压缩库结合使用。像这样:

zw := // new zip writer from buffer or temp file
newFileName := // file name to add
reader, _ := zip.NewReader(bytes.NewReader(existingFile), int64(len(existingFile)))
for _, file := range reader.File {
    if file.Name == newFileName {
        continue // don't copy the old file over to avoid duplicates
    }
    fw, _ := zw.Create(file.Name)
    fr, _ := file.Open()
    io.Copy(fw, fr)
    fr.Close()
}

然后,您将返回新编写器并根据需要附加文件。如果不确定哪些文件可能重叠,则可以将其转换为带有文件名列表的函数,最终将其添加。您还可以使用此逻辑从现有存档中删除文件。

答案 3 :(得分:0)

您可以:

  1. 将旧的zip项目复制到新的zip文件中;
  2. 将新文件添加到新的zip文件中;
zipReader, err := zip.OpenReader(zipPath)
targetFile, err := os.Create(targetFilePath)
targetZipWriter := zip.NewWriter(targetFile)

for _, zipItem := range zipReader.File {
    zipItemReader, err := zipItem.Open()
    header, err := zip.FileInfoHeader(zipItem.FileInfo())
    header.Name = zipItem.Name
    targetItem, err := targetZipWriter.CreateHeader(header)
    _, err = io.Copy(targetItem, zipItemReader)
}

addNewFiles(targetZipWriter) // IMPLEMENT YOUR LOGIC