Ich habe eine Gulp-Aufgabe, wo ich viele Dateien (mehr als 2700 in einem Fall, in einigen anderen Fällen mehrere tausend) in einer ZIP-Datei hinzufügen kann. Der Code ist wie folgt:Wie erstelle ich eine ZIP-Datei mit Gulp, die viele Dateien enthält?
const fs = require('fs');
const archiver = require('archiver')('zip');
let zip = fs.createWriteStream('my-archive.zip');
return gulp.src('app/**/*')
.pipe(through.obj((file, encoding, cb) => {
let pathInZip = '...';
if (!isADirectory(file.path)) { // Do not zip the directory itself
archiver.append(fs.createReadStream(file.path), {
name: pathInZip,
mode: fs.statSync(file.path)
});
}
cb(null, file);
}, cb => {
// Now create the ZIP file!
archiver.pipe(zip);
archiver.finalize();
cb();
}));
Dieser Code funktioniert auf kleine Projekte, aber wenn es mit mehr als 2000 Dateien handelt, erhalte ich folgende Fehlermeldung:
events.js:154
throw er; // Unhandled 'error' event
^
Error: EMFILE: too many open files, open 'd:\dev\app\some\file'
at Error (native)
So dass ich verstehe, mit 2000+ Dateien, die gleichzeitig geöffnet werden, bevor sie in den ZIP geschrieben werden, sind keine gute Idee.
Wie kann ich die ZIP-Datei schreiben, ohne dass ich alle Dateien öffnen muss?
Danke.
Informationen: Knoten 5.5.0/3.8.5 npm/archiver 1.0.0/windows
'archiver.append' ein' callback' als letztes Argument akzeptiert, vielleicht versuchen, es den Stream zu schließen? – jjm