我们可以使用Go语言创建一个zip新文件并添加文件。
但是,如何使用GoLang添加带有现有zip文件的新文件?
如果我们可以使用Create函数,如何获取zip.writer引用?
有点困惑。
答案 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)
您可以:
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