Узел — чтение содержимого всех файлов в каталоге и каталогов внутри этого каталога.

Моя структура каталогов выглядит следующим образом

|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);
      });
    }
  });
});

Мне не нужен массив каталогов. Я хочу прочитать содержимое каждого файла в каталоге и подкаталогах и сопоставить строку. Если строка присутствует, введите ее в массив с именем файла.


person Nikita Jajodia    schedule 23.06.2017    source источник
comment
Возможный дубликат Получить все каталоги в каталоге nodejs   -  person Arpit Solanki    schedule 23.06.2017
comment
Мне не нужен массив каталогов. Я хочу прочитать содержимое каждого файла в каталоге и подкаталогах и сопоставить строку. Если строка присутствует, введите ее в массив с именем файла.   -  person Nikita Jajodia    schedule 23.06.2017
comment
В этом ответе, упомянутом выше, четко указано, что вы можете проверить, является ли это файлом или каталогом, если это каталог, то вы применяете рекурсивную функцию для перехода в подкаталоги и так далее. Если вы хотите сопоставить строки, вы можете поставить условие, проверяющее строку с именем файла   -  person Arpit Solanki    schedule 23.06.2017


Ответы (3)


Я подозреваю, что у вас проблемы с рекурсией. Вот образец, который поможет вам начать работу.

ВНИМАНИЕ. Он написан синхронно, чтобы упростить поиск, и не проверяет наличие не файлов (символических ссылок, сокетов и т. д.), но должен идти по правильному пути. Я также использовал интерполяцию строк для построения путей... вы должны использовать 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 перед чтением (или использовать рекурсию через результат)

person Wainage    schedule 23.06.2017

Этот фрагмент кода может сделать это очень хорошо, возьмите цикл:

  let data = [];

  fs.readdirSync("absolute-directory", "utf8").forEach((file) => {
    data.push(fs.readFileSync("absolute-directory" + file, "utf8"));
  });

  return data;
}

person Md.Abdul Halim Rafi    schedule 09.10.2020

Вы не можете сделать этот поиск "рекурсивно".

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');
person Pezhman Parsaee    schedule 23.06.2017