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