2016-11-03 01:33:53 +01:00
|
|
|
var fs = require("fs"),
|
|
|
|
pth = require('path');
|
|
|
|
|
|
|
|
fs.existsSync = fs.existsSync || pth.existsSync;
|
2016-11-16 01:59:39 +01:00
|
|
|
|
2016-11-03 01:33:53 +01:00
|
|
|
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:
|
2016-11-16 01:59:39 +01:00
|
|
|
return 'UNSUPPORTED (' + method + ')';
|
2016-11-03 01:33:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
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;
|
|
|
|
},
|
|
|
|
|
2016-11-16 01:59:39 +01:00
|
|
|
writeFileToAsync : function(/*String*/path, /*Buffer*/content, /*Boolean*/overwrite, /*Number*/attr, /*Function*/callback) {
|
|
|
|
if(typeof attr === 'function') {
|
|
|
|
callback = attr;
|
|
|
|
attr = undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
fs.exists(path, function(exists) {
|
|
|
|
if(exists && !overwrite)
|
|
|
|
return callback(false);
|
|
|
|
|
|
|
|
fs.stat(path, function(err, stat) {
|
|
|
|
if(exists &&stat.isDirectory()) {
|
|
|
|
return callback(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
var folder = pth.dirname(path);
|
|
|
|
fs.exists(folder, function(exists) {
|
|
|
|
if(!exists)
|
|
|
|
mkdirSync(folder);
|
|
|
|
|
|
|
|
fs.open(path, 'w', 438, function(err, fd) {
|
|
|
|
if(err) {
|
|
|
|
fs.chmod(path, 438, function(err) {
|
|
|
|
fs.open(path, 'w', 438, function(err, fd) {
|
|
|
|
fs.write(fd, content, 0, content.length, 0, function(err, written, buffer) {
|
|
|
|
fs.close(fd, function(err) {
|
|
|
|
fs.chmod(path, attr || 438, function() {
|
|
|
|
callback(true);
|
|
|
|
})
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
if(fd) {
|
|
|
|
fs.write(fd, content, 0, content.length, 0, function(err, written, buffer) {
|
|
|
|
fs.close(fd, function(err) {
|
|
|
|
fs.chmod(path, attr || 438, function() {
|
|
|
|
callback(true);
|
|
|
|
})
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
fs.chmod(path, attr || 438, function() {
|
|
|
|
callback(true);
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|
|
|
|
},
|
|
|
|
|
2016-11-03 01:33:53 +01:00
|
|
|
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
|
|
|
|
}
|
|
|
|
})();
|