【发布时间】:2011-08-02 05:10:28
【问题描述】:
我想下降一个目录,并根据正则表达式检查我在其中看到的每个文件的名称。基本上,一个普通的 unix find 命令的版本,只用 Node.js 编写。我不关心文件的顺序,但我确实想确保获得所有文件。
我有以下代码,这与我想要的很接近(我认为)。它需要一个 startdir、一个正则表达式和一个回调;对于它分析的每个文件,它会将sentinel 的值增加一,当它完成分析时,它会减少标记。我担心的是,如果有一个文件和一个深度嵌套的目录集合,它会在找到第二个文件之前很久就分析该文件并触发回调,并且可能会调用两次回调。
显然,我可以通过使用fired 变量来阻止回调被调用两次,以阻止它再次触发。但这仍然会给我错误的数据。我在这里做错了什么,是否有更适合节点的方法来做到这一点?
fs = require('fs')
path = require('path')
function get_all_files(startdir, regexp, callback) {
var sentinel = 0;
var results = [];
function check_sentinel() {
sentinel--;
if (sentinel === 0) {
callback(results);
}
}
function check_file(dir, filename) {
var fname;
sentinel++;
if (regexp.test(filename)) {
results.push(path.join(dir, filename));
}
check_sentinel();
}
function check_directory(dir) {
fs.readdir(path.join(this.rootpath, dirpath), function(err, files) {
var fname, i, len, npath;
if (err) {
throw err
}
for (i = 0, len = files.length; i < len; i++) {
fname = files[i];
npath = path.join(dir, fname);
fs.stat(npath, function(err, stats) {
if (stats.isFile()) {
check_file(dir, fname);
} else {
if (stats.isDirectory()) {
check_directory(npath);
}
}
});
}
});
}
check_directory(startdir);
}
【问题讨论】:
标签: asynchronous node.js