146 lines
4.4 KiB
JavaScript
146 lines
4.4 KiB
JavaScript
|
var fs = require("fs"),
|
||
|
pth = require('path');
|
||
|
|
||
|
fs.existsSync = fs.existsSync || pth.existsSync;
|
||
|
|
||
|
module.exports = (function() {
|
||
|
|
||
|
var crcTable = [],
|
||
|
Constants = require('./constants'),
|
||
|
Errors = require('./errors'),
|
||
|
|
||
|
PATH_SEPARATOR = pth.normalize("/");
|
||
|
|
||
|
|
||
|
function mkdirSync(/*String*/path) {
|
||
|
var resolvedPath = path.split(PATH_SEPARATOR)[0];
|
||
|
path.split(PATH_SEPARATOR).forEach(function(name) {
|
||
|
if (!name || name.substr(-1,1) == ":") return;
|
||
|
resolvedPath += PATH_SEPARATOR + name;
|
||
|
var stat;
|
||
|
try {
|
||
|
stat = fs.statSync(resolvedPath);
|
||
|
} catch (e) {
|
||
|
fs.mkdirSync(resolvedPath);
|
||
|
}
|
||
|
if (stat && stat.isFile())
|
||
|
throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function findSync(/*String*/root, /*RegExp*/pattern, /*Boolean*/recoursive) {
|
||
|
if (typeof pattern === 'boolean') {
|
||
|
recoursive = pattern;
|
||
|
pattern = undefined;
|
||
|
}
|
||
|
var files = [];
|
||
|
fs.readdirSync(root).forEach(function(file) {
|
||
|
var path = pth.join(root, file);
|
||
|
|
||
|
if (fs.statSync(path).isDirectory() && recoursive)
|
||
|
files = files.concat(findSync(path, pattern, recoursive));
|
||
|
|
||
|
if (!pattern || pattern.test(path)) {
|
||
|
files.push(pth.normalize(path) + (fs.statSync(path).isDirectory() ? PATH_SEPARATOR : ""));
|
||
|
}
|
||
|
|
||
|
});
|
||
|
return files;
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
makeDir : function(/*String*/path) {
|
||
|
mkdirSync(path);
|
||
|
},
|
||
|
|
||
|
crc32 : function(buf) {
|
||
|
var b = new Buffer(4);
|
||
|
if (!crcTable.length) {
|
||
|
for (var n = 0; n < 256; n++) {
|
||
|
var c = n;
|
||
|
for (var k = 8; --k >= 0;) //
|
||
|
if ((c & 1) != 0) { c = 0xedb88320 ^ (c >>> 1); } else { c = c >>> 1; }
|
||
|
if (c < 0) {
|
||
|
b.writeInt32LE(c, 0);
|
||
|
c = b.readUInt32LE(0);
|
||
|
}
|
||
|
crcTable[n] = c;
|
||
|
}
|
||
|
}
|
||
|
var crc = 0, off = 0, len = buf.length, c1 = ~crc;
|
||
|
while(--len >= 0) c1 = crcTable[(c1 ^ buf[off++]) & 0xff] ^ (c1 >>> 8);
|
||
|
crc = ~c1;
|
||
|
b.writeInt32LE(crc & 0xffffffff, 0);
|
||
|
return b.readUInt32LE(0);
|
||
|
},
|
||
|
|
||
|
methodToString : function(/*Number*/method) {
|
||
|
switch (method) {
|
||
|
case Constants.STORED:
|
||
|
return 'STORED (' + method + ')';
|
||
|
case Constants.DEFLATED:
|
||
|
return 'DEFLATED (' + method + ')';
|
||
|
default:
|
||
|
return 'UNSUPPORTED (' + method + ')'
|
||
|
}
|
||
|
|
||
|
},
|
||
|
|
||
|
writeFileTo : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr) {
|
||
|
if (fs.existsSync(path)) {
|
||
|
if (!overwrite)
|
||
|
return false; // cannot overwite
|
||
|
|
||
|
var stat = fs.statSync(path);
|
||
|
if (stat.isDirectory()) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
var folder = pth.dirname(path);
|
||
|
if (!fs.existsSync(folder)) {
|
||
|
mkdirSync(folder);
|
||
|
}
|
||
|
|
||
|
var fd;
|
||
|
try {
|
||
|
fd = fs.openSync(path, 'w', 438); // 0666
|
||
|
} catch(e) {
|
||
|
fs.chmodSync(path, 438);
|
||
|
fd = fs.openSync(path, 'w', 438);
|
||
|
}
|
||
|
if (fd) {
|
||
|
fs.writeSync(fd, content, 0, content.length, 0);
|
||
|
fs.closeSync(fd);
|
||
|
}
|
||
|
fs.chmodSync(path, attr || 438);
|
||
|
return true;
|
||
|
},
|
||
|
|
||
|
findFiles : function(/*String*/path) {
|
||
|
return findSync(path, true);
|
||
|
},
|
||
|
|
||
|
getAttributes : function(/*String*/path) {
|
||
|
|
||
|
},
|
||
|
|
||
|
setAttributes : function(/*String*/path) {
|
||
|
|
||
|
},
|
||
|
|
||
|
toBuffer : function(input) {
|
||
|
if (Buffer.isBuffer(input)) {
|
||
|
return input;
|
||
|
} else {
|
||
|
if (input.length == 0) {
|
||
|
return new Buffer(0)
|
||
|
}
|
||
|
return new Buffer(input, 'utf8');
|
||
|
}
|
||
|
},
|
||
|
|
||
|
Constants : Constants,
|
||
|
Errors : Errors
|
||
|
}
|
||
|
})();
|