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 | |
} | |
})(); |