mirror of https://github.com/jkjoy/sunpeiwen.git
136 lines
4.4 KiB
JavaScript
136 lines
4.4 KiB
JavaScript
var Async = require('../sdk/async');
|
|
var Batch = require('batch');
|
|
var fs = require('fs');
|
|
var os = require('os');
|
|
|
|
var platform = os.platform();
|
|
var createFile = function (filepath, size, callback) {
|
|
var cb = function (err) {
|
|
callback && callback(err);
|
|
};
|
|
if (fs.existsSync(filepath)) {
|
|
cb('file existed.');
|
|
} else {
|
|
var cmd;
|
|
switch (platform) {
|
|
case 'win32':
|
|
cmd = 'fsutil file createnew ' + filepath + ' ' + size;
|
|
break;
|
|
case 'darwin':
|
|
case 'linux':
|
|
cmd = 'dd if=/dev/zero of=' + filepath + ' count=1 bs=' + size;
|
|
break;
|
|
}
|
|
var exec = require('child_process').exec;
|
|
exec(cmd, function (err, stdout, stderr) {
|
|
cb(err);
|
|
});
|
|
}
|
|
};
|
|
|
|
var simpleListFolder = function(rootPath, callback) {
|
|
var result = [];
|
|
var deep = function(dirPath, deepNext) {
|
|
fs.readdir(dirPath, function (err, list) {
|
|
if (err) return console.error(err);
|
|
Async.eachLimit(list, 10, function (fileName, asyncNext) {
|
|
var filePath = pathLib.resolve(dirPath, fileName);
|
|
fs.stat(filePath, function (err, stats) {
|
|
if (stats.isDirectory()) {
|
|
result.push(filePath + pathLib.sep);
|
|
deep(filePath, asyncNext);
|
|
} else {
|
|
result.push(filePath);
|
|
asyncNext();
|
|
}
|
|
});
|
|
}, deepNext);
|
|
});
|
|
};
|
|
deep(rootPath, function (err) {
|
|
result.sort();
|
|
callback(err, result);
|
|
});
|
|
};
|
|
|
|
const fastListFolder = function(options, callback) {
|
|
const pathJoin = function(dir, name, isDir) {
|
|
dir = dir.replace(/\\/g, '/');
|
|
const sep = dir.endsWith('/') ? '' : '/';
|
|
let p = dir + sep + name;
|
|
p = p.replace(/\\/g, '/');
|
|
isDir && name && (p += '/');
|
|
return p;
|
|
};
|
|
|
|
const readdir = function stat(dir, cb) {
|
|
if (!dir || !cb) throw new Error('stat(dir, cb[, concurrency])');
|
|
fs.readdir(dir, function(err, files) {
|
|
if (err) return cb(err);
|
|
const batch = new Batch();
|
|
batch.concurrency(16);
|
|
files.forEach(function(file) {
|
|
const filePath = pathJoin(dir, file);
|
|
batch.push(function(done) {
|
|
fs.stat(filePath, done);
|
|
});
|
|
});
|
|
batch.end(function(err, stats) {
|
|
if (err) {
|
|
console.log('readdir error:', err);
|
|
cb(err);
|
|
return;
|
|
}
|
|
stats.forEach(function(stat, i) {
|
|
stat.isDir = stat.isDirectory();
|
|
stat.path = pathJoin(dir, files[i], stat.isDir);
|
|
stat.isDir && (stat.size = 0);
|
|
});
|
|
cb(err, stats);
|
|
});
|
|
});
|
|
};
|
|
|
|
const statFormat = function(stat) {
|
|
return {
|
|
path: stat.path,
|
|
size: stat.size,
|
|
isDir: stat.isDir
|
|
};
|
|
};
|
|
|
|
if (typeof options !== 'object') options = { path: options };
|
|
const rootPath = options.path;
|
|
let list = [];
|
|
const _callback = function(err) {
|
|
if (err) {
|
|
callback(err);
|
|
} else if (list.length > 1000000) {
|
|
callback(window.lang.t('error.too_much_files'));
|
|
} else {
|
|
callback(null, list);
|
|
}
|
|
};
|
|
const deep = function(dirStat, deepNext) {
|
|
list.push(statFormat(dirStat));
|
|
readdir(dirStat.path, function(err, files) {
|
|
if (err) return deepNext();
|
|
const dirList = files.filter(file => file.isDir);
|
|
const fileList = files.filter(file => !file.isDir);
|
|
list = [].concat(list, fileList.map(statFormat));
|
|
Async.eachLimit(dirList, 1, deep, deepNext);
|
|
});
|
|
};
|
|
fs.stat(rootPath, function(err, stat) {
|
|
if (err) return _callback();
|
|
stat.isDir = true;
|
|
stat.path = pathJoin(rootPath, '', true);
|
|
stat.isDir && (stat.size = 0);
|
|
deep(stat, _callback);
|
|
});
|
|
};
|
|
|
|
exports.simpleListFolder = simpleListFolder;
|
|
exports.fastListFolder = fastListFolder;
|
|
exports.createFile = createFile;
|