我的目录结构如下
|demo
|abc
abc.js
abc.html
|xyz
test.js
test.html
|images
pqr.js
我想阅读演示存储库及其子存储库中每个文件的内容。需要匹配每个文件中的模式和成功匹配,该条目应与文件名一起进入数组。有什么建议吗?
我尝试了以下代码,但它不会读取子目录中的文件
var fs=require('fs');
var dir = './demo';
fs.readdir(dir,function(err,files){
if (err) throw err;
files.forEach(function(file){
if(file) {
fs.readFile('./demo/'+file, 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
console.log(data);
});
}
});
});
我不想要一个目录数组。我想读取目录和子目录中每个文件的内容并匹配一个字符串。如果该字符串存在,请将其输入到具有文件名的数组中。
答案 0 :(得分:2)
我怀疑你遇到了涉及递归的问题。这是一个让你前进的样本。
警告即可。它是同步编写的,以便更容易理解并且不检查非文件(符号链接,套接字等),但应该走上正确的道路。我还使用字符串插值来构建路径......你应该使用path.join
function getFiles(dir) {
// get all 'files' in this directory
var all = fs.readdirSync(dir);
// process each checking directories and saving files
return all.map(file => {
// am I a directory?
if (fs.statSync(`${dir}/${file}`).isDirectory()) {
// recursively scan me for my files
return getFiles(`${dir}/${file}`);
}
// WARNING! I could be something else here!!!
return `${dir}/${file}`; // file name (see warning)
});
}
这将返回一个文件名的嵌套数组,你应该在读取之前使用flatMap(或者通过结果使用递归)
答案 1 :(得分:1)
这段代码可以很好地做到这一点,请循环一遍:
Scaffold(
appBar: AppBar(
title: searchbar(),
actions: [
NavigationControls(_controller.future),
],
答案 2 :(得分:0)
你不能“递归地”进行搜索。
var fs = require('fs');
var path = require('path');
var recursiveSearch = function(directoryPath) {
fs.readdir(directoryPath, function(err, list) {
if (err) { return }
list.forEach(function(file) {
file = path.resolve(directoryPath, file);
fs.stat(file, function (err, stat) {
if (stat && stat.isDirectory()) {
recursiveSearch(file);
} else {
fs.readFile(file, function (err, data) {
// read file contents here and
console.log(file);
console.log(data);
})
}
})
})
})
};
recursiveSearch('C:\\sample_directory');