扫描大量文件

时间:2015-05-31 06:19:25

标签: node.js node-webkit

我正在尝试扫描大量图像,但我遇到了一些麻烦。我的示例文件夹有大约4k个小文件,我一直遇到EMFILE错误。

我正在使用async.queue尝试将处理的文件数限制为一次只有10个。这应该在文件描述符限制之下,但它不起作用。几千个将被正确扫描,但我会在第一个文件完成之前开始获取其他文件的错误。

在我看来,他们似乎并没有真正排队,在数据输出到控制台之前很久就看到了很多“文件完成”和“结束”,我不知道为什么。< / p>

我对Node.js很陌生,所以如果有人有更好的想法如何处理和做到这一点,我真的很感激。谢谢你的帮助。

var fs = require('fs');
var crypt = require('crypto');
var path = '../pictures/';
var async = require('async');

function end(err) {
    console.log(err);
}

function fileDone(err) {
    if(err) {
        console.log(err);
    } else {
        console.log('file done');
    }
}

function scanDirectory(path, queue, callback, recursive) {

    fs.readdir(path,function(err,files) {

        if(err) {
            callback(err);
        }

            files.forEach(function(file) {

                fs.stat(path + file, function(err,stats) {

                    if(err) {
                        console.log(err);
                    }

                    if(recursive && stats && stats.isDirectory()) {

                        var newPath = path + file + '/';

                        scanDirectory(newPath, queue, callback, recursive);

                    } else if (!stats.isDirectory()) {

                        queue.push(path + file, fileDone);

                    }
                });
            });     
    });
}

var q = async.queue(function(file, callback) {
    var hash = crypt.createHash('md5');
    var stream = fs.createReadStream(file);

    stream.on('data',function(data) {
        hash.update(data,'utf8');
    });

    stream.on('end',function() {
        var md5 = hash.digest('hex');

        console.log(file);
        console.log(md5);
    });

    callback();
},10);

q.empty = function() {
    console.log('the end');
}

scanDirectory(path, q, end, false);

1 个答案:

答案 0 :(得分:0)

async.queue中,只需在stream.on('end'

之后移动console.log功能中的回调即可

添加stream.on('error', callback);来处理错误:)