我在Windows 7服务器上有一个平面(单个目录),我填充了文件,然后需要获取所有PNG文件(名称和大小),然后是总大小。我一直用C#做这个。
private void CreateManifest()
{
var dir = new DirectoryInfo(jobPath);
string id;
long size;
foreach (var f in dir.EnumerateFiles("*.png"))
{
id = f.Name.Replace(".png", "");
size = f.Length;
manifest.files.Add(new FileData(id, size));
manifest.FileCount++;
manifest.Size += size;
}
}
由于可能有几千个文件,我需要快速。我可以使用EDGE模块(https://github.com/tjanczuk/edge)直接从Node调用.NET。 [如果您尝试过EDGE,我推荐它。通过完整的异步回调支持和对象编组,将本机.NET C#,F#和python包含在NODEJS项目中是一种很好的方法。
是否有原生的NODE技术?哪一个会是最快的?
我很想做一个fs.readdir和fs.lstat()所有文件(参见:https://sankartypo3.wordpress.com/2013/02/12/how-to-list-files-and-folders-using-nodejs/)
我也看过一些目录漫步者程序,这可能是好的:https://github.com/oleics/node-filewalker
但我真正需要的是在Windows机器上的快速性能。
[背景:这是来自原始图像的256x256地图图块金字塔的生成(child_Process)的后处理阶段,文件数量可能非常大]。
答案 0 :(得分:1)
是的,readdir和lstat是我能想到的最快的方式。我的示例中唯一的额外内容是名为async的库,它允许我们并行运行所有lstat调用。
var fs = require('fs'); // native fs module
var async = require('async'); // async node module (npm install async)
var manifest = {
files: []
, size: 0
}
var directory = __dirname; // just an example
// returns a list of filenames in the directory
fs.readdir(directory, function(err, files) {
//Run for each file in files
async.forEach(files, function(file, callback) {
// Check file extension
if (file.substr(file.lastIndexOf(".")) == ".png") {
// stat file (size is in this)
fs.lstat(directory + "/" + file, function(err, data) {
// Update our manifest object with new data
manifest.size += data.size;
manifest.files.push({
name: file.substr(0,file.lastIndexOf(".")) //filename without .png
, size: data.size
});
// Let async know this file is done
callback(err);
});
}
else {
// Let async know this file is done
callback();
}
},
function(err) { //This is only called after all files have fired their 'callback'
console.log(err);
console.log('files', manifest.files);
console.log('file count', manifest.files.length);
console.log('total size', manifest.size);
});
});
如果您对此代码有任何疑问,请随时提出。
答案 1 :(得分:0)
这就是我的工作:
function tileList(job, callback) {
var tiles = [];
var byteCount = 0;
fs.readdir(job.root, function (err, files) {
if (err) {
logger.log('error', 'tileList directory read: %s \n', job.root, { message: err.message, stack: err.stack });
return job.next(err);
}
async.each(files, function (file, done) {
var fileName = file.split(".");
fs.lstat(job.root + "\\" + file, function (err, stats) {
if (!err && stats.isFile() && (fileName[1] == "png")) {
tiles.push({ id: fileName[0], size: stats.size });
byteCount += stats.size;
};
done(null);
});
}, function (err) {
job.tileList = tiles;
job.byteCount = byteCount;
return callback(null, "got tile list");}
);
});
}