我想使用nodejs找到src文件夹中的所有*.html文件及其所有子文件夹.最好的方法是什么?
var folder = '/project1/src';
var extension = 'html';
var cb = function(err, results) {
// results is an array of the files with path relative to the folder
console.log(results);
}
// This function is what I am looking for. It has to recursively traverse all sub folders.
findFiles(folder, extension, cb);
Run Code Online (Sandbox Code Playgroud)
我认为很多开发人员应该拥有优秀且经过测试的解决方案,并且使用它比自己编写解决方案更好.
Luc*_*ato 69
node.js,递归简单函数:
var path = require('path'), fs=require('fs');
function fromDir(startPath,filter){
//console.log('Starting from dir '+startPath+'/');
if (!fs.existsSync(startPath)){
console.log("no dir ",startPath);
return;
}
var files=fs.readdirSync(startPath);
for(var i=0;i<files.length;i++){
var filename=path.join(startPath,files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()){
fromDir(filename,filter); //recurse
}
else if (filename.indexOf(filter)>=0) {
console.log('-- found: ',filename);
};
};
};
fromDir('../LiteScript','.html');
Run Code Online (Sandbox Code Playgroud)
如果你想获得想象力,可以添加RegExp,并使用回调来使其成为通用的.
var path = require('path'), fs=require('fs');
function fromDir(startPath,filter,callback){
//console.log('Starting from dir '+startPath+'/');
if (!fs.existsSync(startPath)){
console.log("no dir ",startPath);
return;
}
var files=fs.readdirSync(startPath);
for(var i=0;i<files.length;i++){
var filename=path.join(startPath,files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()){
fromDir(filename,filter,callback); //recurse
}
else if (filter.test(filename)) callback(filename);
};
};
fromDir('../LiteScript',/\.html$/,function(filename){
console.log('-- found: ',filename);
});
Run Code Online (Sandbox Code Playgroud)
Dav*_*ung 51
我喜欢使用glob包:
const glob = require('glob');
glob(__dirname + '/**/*.html', {}, (err, files)=>{
console.log(files)
})
Run Code Online (Sandbox Code Playgroud)
Mas*_*mes 18
什么,坚持下去?!...好吧,也许这对其他人来说也更有意义.
[ nodejs 7介意你]
fs = import('fs');
let dirCont = fs.readdirSync( dir );
let files = dirCont.filter( function( elm ) {return elm.match(/.*\.(htm?html)/ig);});
Run Code Online (Sandbox Code Playgroud)
使用正则表达式执行任何操作使其成为您在函数中使用默认值等设置的参数.
Nic*_*.Xu 12
根据Lucio的代码,我制作了一个模块.它将返回一个带有特定扩展名的所有文件.只需在此处发布,以防任何人需要它.
var path = require('path'),
fs = require('fs');
/**
* Find all files recursively in specific folder with specific extension, e.g:
* findFilesInDir('./project/src', '.html') ==> ['./project/src/a.html','./project/src/build/index.html']
* @param {String} startPath Path relative to this file or other file which requires this files
* @param {String} filter Extension name, e.g: '.html'
* @return {Array} Result files with path string in an array
*/
function findFilesInDir(startPath,filter){
var results = [];
if (!fs.existsSync(startPath)){
console.log("no dir ",startPath);
return;
}
var files=fs.readdirSync(startPath);
for(var i=0;i<files.length;i++){
var filename=path.join(startPath,files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()){
results = results.concat(findFilesInDir(filename,filter)); //recurse
}
else if (filename.indexOf(filter)>=0) {
console.log('-- found: ',filename);
results.push(filename);
}
}
return results;
}
module.exports = findFilesInDir;
Run Code Online (Sandbox Code Playgroud)
小智 11
您可以使用Filehound执行此操作.
例如:在/ tmp中查找所有.html文件:
const Filehound = require('filehound');
Filehound.create()
.ext('html')
.paths("/tmp")
.find((err, htmlFiles) => {
if (err) return console.error("handle err", err);
console.log(htmlFiles);
});
Run Code Online (Sandbox Code Playgroud)
有关更多信息(和示例),请查看文档:https: //github.com/nspragg/filehound
免责声明:我是作者.
小智 7
以下代码在 ./ 内进行递归搜索(适当更改)并返回以 .html 结尾的绝对文件名数组
var fs = require('fs');
var path = require('path');
var searchRecursive = function(dir, pattern) {
// This is where we store pattern matches of all files inside the directory
var results = [];
// Read contents of directory
fs.readdirSync(dir).forEach(function (dirInner) {
// Obtain absolute path
dirInner = path.resolve(dir, dirInner);
// Get stats to determine if path is a directory or a file
var stat = fs.statSync(dirInner);
// If path is a directory, scan it and combine results
if (stat.isDirectory()) {
results = results.concat(searchRecursive(dirInner, pattern));
}
// If path is a file and ends with pattern then push it onto results
if (stat.isFile() && dirInner.endsWith(pattern)) {
results.push(dirInner);
}
});
return results;
};
var files = searchRecursive('./', '.html'); // replace dir and pattern
// as you seem fit
console.log(files);
Run Code Online (Sandbox Code Playgroud)
我查看了以上答案,并将这个适用于我的版本混合在一起:
function getFilesFromPath(path, extension) {
let dir = fs.readdirSync( path );
return dir.filter( elm => elm.match(new RegExp(`.*\.(${extension})`, 'ig')));
}
console.log(getFilesFromPath("./testdata", ".txt"));
Run Code Online (Sandbox Code Playgroud)
该测试将从路径下的文件夹中找到的文件返回文件名数组./testdata。正在处理节点版本8.11.3。
| 归档时间: |
|
| 查看次数: |
69564 次 |
| 最近记录: |