Node-读取目录中所有文件的内容以及该目录中的目录
Node- Read the content of all files in a directory and directories inside that directory
我的目录结构如下
|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);
});
}
});
});
我不需要目录数组。我想读取目录和子目录中的每个文件的内容并匹配一个字符串。如果存在该字符串,则将其输入到包含文件名的数组中。
我怀疑您遇到了涉及的递归问题。这是一个让你开始的例子。
警告。它是同步编写的,以便更容易理解,并且不检查非文件(符号链接、套接字等),但应该走上正确的道路。我还使用字符串插值来构建路径......你应该使用 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)
});
}
这个 returns 一个文件名的嵌套数组,你应该在阅读之前 flatMap(或使用递归通过结果)
您不能执行此搜索"recursively"。
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');
这段代码可以很好地做到这一点,循环一下:
let data = [];
fs.readdirSync("absolute-directory", "utf8").forEach((file) => {
data.push(fs.readFileSync("absolute-directory" + file, "utf8"));
});
return data;
}
我的目录结构如下
|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);
});
}
});
});
我不需要目录数组。我想读取目录和子目录中的每个文件的内容并匹配一个字符串。如果存在该字符串,则将其输入到包含文件名的数组中。
我怀疑您遇到了涉及的递归问题。这是一个让你开始的例子。
警告。它是同步编写的,以便更容易理解,并且不检查非文件(符号链接、套接字等),但应该走上正确的道路。我还使用字符串插值来构建路径......你应该使用 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)
});
}
这个 returns 一个文件名的嵌套数组,你应该在阅读之前 flatMap(或使用递归通过结果)
您不能执行此搜索"recursively"。
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');
这段代码可以很好地做到这一点,循环一下:
let data = [];
fs.readdirSync("absolute-directory", "utf8").forEach((file) => {
data.push(fs.readFileSync("absolute-directory" + file, "utf8"));
});
return data;
}