Node.js jszip库来提取

我正在写一些节点代码,并使用jszip压缩和解压缩一些文件。 我知道如何压缩,但不知道如何解压缩或解压缩。 有几个链接在stackoverflow不起作用。 任何人都有解决办法? 以下是我所尝试过的

var fs = require('fs'); var JSZip = require('jszip'); var zipName = "C:/test.zip"; var unzip = "C:/unzip"; fs.readFile(zipName, function (err, data) { if (err) throw err; var zip = new JSZip(); zip.folder(unzip).load(data); }); 

JSZip没有方法在磁盘上写入文件。 要做到这一点,你需要遍历zip.files

 var path = require("path"); Object.keys(zip.files).forEach(function(filename) { var content = zip.files[filename].asNodeBuffer(); var dest = path.join(unzip, filename); fs.writeFileSync(dest, content); } 

在一个zip文件中,文件夹用斜杠'/'表示,我认为 path.join()会创build一个正确的path,但是我不能testing这个。

可能是由于我错误地实现了asNodeBuffer和我对JS的经验不足,但是我一直在错误地提取文件。 我想分享什么最终为我工作,我testing了一个250 + MB文件。

 ... fs.readFile(tmpFilePath, function (err, data) { if (err) { throw err; } logger.debug('[method] Before extracting file...'); JSZip.loadAsync(data).then(function (zip) { var files = Object.keys(zip.files); logger.debug('[method] files to be created ' + files.length); // in my case, the folders where not being created while "inflating" the content. created the folders in a separated loop // O(n) for those geeks on complexity. createDirectories(files); createFiles(files, zip, someOtherFunctionReference); }).catch(function (err) { deferred.reject(err); }); }); ... /** * Sync opperation to create the folders required for the files. * @param files */ function createDirectories(files) { files.forEach(function (filename) { var dest = path.join(folderName, filename); ensureDirectoryExistence(dest); }); } /** * recursive create directory function * @param filePath * @returns {boolean} */ function ensureDirectoryExistence(filePath) { var dirname = path.dirname(filePath); if (fs.existsSync(dirname)) { return true; } ensureDirectoryExistence(dirname); fs.mkdirSync(dirname); } /** * Create files sync or blocking * @param files * @param zip * @param cb */ function createFiles(files, zip, cb) { try { var countFilesCreated = 0; files.forEach(function (filename) { var dest = path.join(folderName, filename); // skip directories listed if (dest.charAt(dest.length - 1) === '/') { countFilesCreated++; return; } return zip.file(filename).async('nodebuffer').then(function(content){ // var content = zip.files[filename].nodeStream(); fs.writeFileSync(dest, content); countFilesCreated++; // proably someone with more experience in JS can implement a promice like solution. // I thought that in here instead of the counter we coud use an indexOf to return an error in case not all the elements where created correctly. // but if a file throw an error, its handled by the catch ... if (countFilesCreated >= files.length) { logger.debug('All files created!!'); cb(); } }); }); } catch (err) { throw err; } } 

我希望这有帮助。