通过扩展名查找文件,*.html在nodejs中的文件夹下

Nic*_*.Xu 62 node.js

我想使用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)

使用正则表达式执行任何操作使其成为您在函数中使用默认值等设置的参数.

  • 我试图编辑并被拒绝,我不同意.这是我的建议:https://stackoverflow.com/review/suggested-edits/19188733`wl`无论如何都是如此.还缺少fs的导入.你需要的三行是:1.`const fs = require('fs');`2.`const dirCont = fs.readdirSync(dir);`3.`const files = dirCont.filter((elm)=> /.*\.(htm?html)/ ji.test(elm));` (6认同)
  • 这只会在根目录中获得匹配的文件。 (2认同)

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)


Net*_*964 5

我查看了以上答案,并将这个适用于我的版本混合在一起:

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。

  • 我会在正则表达式的末尾添加 $: `.*\.(${extension})$` (2认同)