Nodejs和更新zip归档文件中的文件

3
我希望使用nodejs更新zip文件中的文件。例如,我有一个包含两个文件的zip文件:
 a.zip
   |-a.txt
   |-b.txt 

我使用Archiver:
var archiver = require('archiver');
var archive = archiver('zip', {});
archive.pipe(fs.createWriteStream('./a.zip'));
archive.append(fs.createReadStream('./c.txt'), { name: 't.txt' });
archive.finalize();

但是我遇到了一个问题,我的存档完全被覆盖了。结果就是我得到了下面的信息: "最初的回答"
 a.zip
   |-t.txt

If I use:

archive.file('./a.txt', { name: 't.txt' });

结果仍然相同。 我希望得到这个结构作为结果。


 a.zip
   |-a.txt
   |-b.txt
   |-t.txt

最初的回答:或者更新文件a.txt或b.txt中的内容。
2个回答

3

目前使用 archiver 不支持向现有的归档文件追加内容。这是一个相关问题,于2013年提出:support appending to existing archives #23

对于您的情况,append 是将内容追加到 中,而不是追加到新文件目标位置上的任何内容。archiver 并不关心 a.zip 中的内容,它只会用 archiver.append 中给出的内容覆盖原有内容。

您最好的选择是使用 maxogden/extract-zip 解压现有文件,然后使用 archiver 将结果追加到新版本的归档文件中。


0

您可以使用 JSZip。您可以参考官方 文档

这里是一个简单的 Node.js 示例:

var fs = require("fs");
var JSZip = require("jszip");

async function zipDemo() {
    // read the existing zip file
    var zipData = fs.readFileSync("input.zip");
    var zip = await JSZip.loadAsync(zipData);
    // add a new JSON file to the zip
    zip.file("sample.json", JSON.stringify({demo:123}));
    // write out the updated zip
    zip.generateNodeStream({type:'nodebuffer', streamFiles:true})
    .pipe(fs.createWriteStream('output.zip'))
    .on('finish', function () {
        console.log("output`enter code here`.zip written.");
    });
}

zipDemo();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接