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