Показать сообщение отдельно
  #1 (permalink)  
Старый 02.06.2012, 01:51
Аватар для DreamTheater
Профессор
Отправить личное сообщение для DreamTheater Посмотреть профиль Найти все сообщения от DreamTheater
 
Регистрация: 15.02.2011
Сообщений: 471

Node.js - Recursive Walker
Что делает:
Рекурсивно проходит от указанного корня и эмитирует события о всех найденных файлах и директориях.

Исходный код:
// Walker.js

var EventEmitter = require('events').EventEmitter,

    fs = require('fs'),
    path = require('path'),
    util = require('util');

module.exports = (function () {
    function Walker() {
        EventEmitter.call(this);
    }

    util.inherits(Walker, EventEmitter);

    Walker.prototype.walk = function (from) {
        try {
            var root = path.resolve(from),
                tree = fs.readdirSync(root);

            this.emit('directory', root);

            tree.forEach(function (leaf) {
                var branch = path.join(root, leaf),
                    stats = fs.statSync(branch);

                if (stats.isFile()) {
                    this.emit('file', branch);
                } else {
                    this.walk(branch);
                }
            }, this);
        } catch (error) {
            this.emit('error', error);
        }

        return this;
    };

    return Walker;
}());


Как использовать:
// sandbox.js

var Walker = require('./Walker');

(function () {
    var walker = new Walker();

    walker.on('file', function (file) {
        console.log('file:', file);
    });

    walker.on('directory', function (directory) {
        console.log('directory:', directory);
    });

    walker.on('error', function (error) {
        console.log('error:', error);
    });

    walker.walk('C:\Windows');
}());


Что получится:
Код:
directory: C:\Windows
directory: C:\Windows\AppCompat
error: { [Error: EPERM, operation not permitted 'C:\Windows\AppCompat\Programs']
  errno: 50,
  code: 'EPERM',
  path: 'C:\\Windows\\AppCompat\\Programs',
  syscall: 'readdir' }
directory: C:\Windows\AppPatch
file: C:\Windows\AppPatch\AcGenral.dll
file: C:\Windows\AppPatch\AcLayers.dll
...
Работает полностью синхронно, то есть никаких заморочек с коллбэками.

Прошу кидать помидорами.

Последний раз редактировалось DreamTheater, 02.06.2012 в 01:57.
Ответить с цитированием