Nodejs和zip存档内的更新文件

b5lpy0ml  于 2022-12-12  发布在  Node.js
关注(0)|答案(2)|浏览(266)

我想在zip arhive与nodejs更新文件。例如,我有两个文件的zip文件:

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

我使用归档器:

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

如果我用途:

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

结果还是一样的。我想得到这个结构

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

或者更新a.txtb.txt文件之一的内容

uujelgoq

uujelgoq1#

archiver目前无法附加到现有归档文件。以下是2013年打开的相关问题:support appending to existing archives #23
在您的例子中,append是附加到 stream,而不是附加到新文件的目标位置。archiver不关心a.zip中的内容,它只是用您给予archiver.append的内容覆盖它。
看起来最好的办法是使用maxogden/extract-zip解压缩现有文件,然后使用archiver将结果附加到新版本的存档中。

vybvopom

vybvopom2#

您可以使用JSZip.您可以参考官方的documentation
下面是一个简单的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();

相关问题