node-zip
Version:
node-zip - Zip/Unzip files ported from JSZip
93 lines (88 loc) • 2.76 kB
JavaScript
var fs = require('fs'),
JSZip = require('jszip'),
path = require('path'),
args = process.argv.slice(2),
zip = new JSZip();
if(/-h|-H|--help|-\?/.test(args)||!args.length) {
printHelp();
} else {
var command = args.shift();
if(command == '-c') {
var zipfile = args.shift();
console.log('Creating %s...', zipfile);
args.forEach(function(file) {
if(fs.existsSync(file)) {
addFile(file);
} else {
console.error('Error: file %s not found.', file);
process.exit(2);
}
});
console.log("Deflating...")
fs.writeFileSync(zipfile, zip.generate({type:"nodebuffer", compression:'DEFLATE'}));
console.log("Done.")
} else if(command == '-x') {
var zipfile = args.shift();
var destination = args.shift();
var zipdata = fs.readFileSync(zipfile);
console.log('Reading %s...', zipfile);
try {
var zip = new JSZip(zipdata, {checkCRC32: true});
} catch(e) {
console.error("Error: invalid file");
process.exit(2);
}
Object.keys(zip.files).forEach(function(filepath) {
file = zip.files[filepath];
if (destination) filepath = destination + path.sep + filepath
if(file.options.dir) {
console.log(' Creating', filepath);
mkdirRecursively(filepath);
} else {
console.log(' Inflating', filepath);
// TODO: add prompt if file exists
fs.writeFileSync(filepath, file.asNodeBuffer());
}
});
console.log('Done.');
} else {
console.error('Error: wrong command')
printHelp();
}
}
function printHelp() {
console.error('Usage:');
console.error(' -c zipfile file1 [file2] [...] Create zip file with file/directory list');
console.error(' -x zipfile [destination] Extract zip file');
console.error(' -h | -H | --help | -? Show help');
process.exit(1);
}
function addFile(filepath) {
if(fs.lstatSync(filepath).isDirectory()) {
console.log(" Adding folder", filepath);
zip.folder(filepath);
var directory = fs.readdirSync(filepath);
directory.forEach(function(subfilepath) {
addFile(path.join(filepath,subfilepath));
});
} else {
console.log(" Adding file", filepath)
zip.file(filepath, fs.readFileSync(filepath, 'binary'));
}
}
function mkdirRecursively(folderpath, mode) {
try {
fs.mkdirSync(folderpath, mode);
return true;
} catch(e) {
if (e.errno == 34) {
mkdirRecursively(path.dirname(folderpath), mode);
mkdirRecursively(folderpath, mode);
} else if (e.errno == 47) {
return true;
} else {
console.log("Error: Unable to create folder %s (errno: %s)", folderpath, e.errno)
process.exit(2);
}
}
};