nodejs如何压缩和解压缩zip文件?
发布于 2年前 作者 151263 6456 次浏览

nodejs如何在内存中压缩和解压缩zip文件?

17 回复

查了一下github上所有关于zip的发现了一个https://github.com/kriskowal/zip 没有说明文档。比较蛋疼~

其实如果C好的话可以引用7z的源码为Nodejs写一个第三方模块

搜到一个只能解压缩的 https://github.com/nearinfinity/node-unzip

fs.createReadStream('path/to/archive.zip').pipe(unzip.Extract({ path: 'output/path' }));
var readStream = fs.createReadStream('path/to/archive.zip');
var writeStream = fstream.Writer('output/path');

fs.createReadStream('path/to/archive.zip')
  .pipe(unzip.Parse())
  .on('entry', function (entry) {
    var fileName = entry.path;
    var type = entry.type; // 'Directory' or 'File'
    var size = entry.size;

    //process the entry or pipe it to another stream
    ...
  });

我也在github上找了很久,比较少,找到最满意的就是adm-zip,但是用起来有问题, 看来,估计只能自己写了…

直接子进程调用 zip 和 unzip?

node的zlib 有没试过?

node的zlib 不能解压zip文件的 里面只是提供了压缩和解压算法而已

这最简单可行的方法了吧… 我一般能用外部binary的都直接用,无所谓绑死不绑死,都是常见的

我觉得可以该换个思路,不一定非要用node来实现。跳出去了方法就多了,简简单单写个shell,从node里exec,应该很容易实现

我已经用node实现了,自己操作二进制 参考了这个文档 http://en.wikipedia.org/wiki/ZIP_%28file_format%29#Extra_field

https://github.com/janjongboom/node-native-zip

这个压缩包 不错。。。`var fs = require(“fs”); var zip = require(“node-native-zip”);

var archive = new zip();

archive.addFiles([ { name: "moehah.txt", path: “./test/moehah.txt” }, { name: "images/suz.jpg", path: “./test/images.jpg” } ], function (err) { if (err) return console.log("err while adding files", err);

var buff = archive.toBuffer();

fs.writeFile("./test2.zip", buff, function () {
    console.log("Finished");
});

});`

这个方法最直接… zip/unzip 指令

但是不能解压缩

var AdmZip = require(‘adm-zip’);

// reading archives
var zip = new AdmZip("./my_file.zip");
var zipEntries = zip.getEntries(); // an array of ZipEntry records

zipEntries.forEach(function(zipEntry) {
    console.log(zipEntry.toString()); // outputs zip entries information
    if (zipEntry.entryName == "my_file.txt") {
         console.log(zipEntry.data.toString('utf8')); 
    }
});
// outputs the content of some_folder/my_file.txt
console.log(zip.readAsText("some_folder/my_file.txt")); 
// extracts the specified file to the specified location
zip.extractEntryTo(/*entry name*/"some_folder/my_file.txt", /*target path*/"/home/me/tempfolder", /*maintainEntryPath*/false, /*overwrite*/true);
// extracts everything
zip.extractAllTo(/*target path*/"/home/me/zipcontent/", /*overwrite*/true);


// creating archives
var zip = new AdmZip();

// add file directly
zip.addFile("test.txt", new Buffer("inner content of the file"), "entry comment goes here");
// add local file
zip.addLocalFile("/home/me/some_picture.png");
// get everything as a buffer
var willSendthis = zip.toBuffer();
// or write everything to disk
zip.writeZip(/*target file name*/"/home/me/files.zip");

如果不限于zip的话, tar.gz 不错,亲测。

回到顶部