我正在尝试使用Node.js从现有文件夹创建一个zip文件,并保留该结构。
我希望有一个简单的模块可以实现这种功能:
archiver.create("../folder", function(zipFile){
console.log('et viola');
});
但我找不到这样的东西!
我一直在谷歌上搜索,到目前为止,我发现最好的是zipstream,但据我所知,没有办法做我想做的事。我真的不想调用命令行实用程序,因为该应用程序必须是跨平台的。
如有任何帮助,我们将不胜感激。
谢谢。
它不是完全无代码的,但您可以将node原生zip与folder.js结合使用。用法:
function zipUpAFolder (dir, callback) {
var archive = new zip();
// map all files in the approot thru this function
folder.mapAllFiles(dir, function (path, stats, callback) {
// prepare for the .addFiles function
callback({
name: path.replace(dir, "").substr(1),
path: path
});
}, function (err, data) {
if (err) return callback(err);
// add the files to the zip
archive.addFiles(data, function (err) {
if (err) return callback(err);
// write the zip file
fs.writeFile(dir + ".zip", archive.toBuffer(), function (err) {
if (err) return callback(err);
callback(null, dir + ".zip");
});
});
});
}
使用节点内置的execfile函数可以更简单地完成这一操作。它生成一个进程,并通过操作系统以本机方式执行zip命令。一切都很正常。
var execFile = require('child_process').execFile;
execFile('zip', ['-r', '-j', zipName, pathToFolder], function(err, stdout) {
console.log(err);
logZipFile(localPath);
});
如果您正在压缩一个sibdirectory,并且不希望在zip文件中有过多的嵌套,那么-j标志会"丢弃"文件路径。
这里有一些关于execfile的文档。这是zip的手册页。
使用Easy zip,npm install easy-zip
,您可以执行:
var zip5 = new EasyZip();
zip5.zipFolder('../easy-zip',function(){
zip5.writeToFile('folderall.zip');
});