Что делает:
Рекурсивно проходит от указанного корня и эмитирует события о всех найденных файлах и директориях.
Исходный код:
// 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
... |
Работает полностью синхронно, то есть никаких заморочек с коллбэками.
Прошу кидать помидорами.