节点目录列表的大小

时间:2014-02-18 16:35:49

标签: windows node.js directory

我在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)的后处理阶段,文件数量可能非常大]。

2 个答案:

答案 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");}
    );
});

}