рекурсивная функция в NodeJS для проверки файла или каталога - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать функцию в NodeJS, которая рекурсивно проверяет, является ли это файл или каталог, используя библиотеку fs для бесконечно глубоких подкаталогов, мой код выглядит примерно так:

function generateComponents(path) {

    fs.readdirSync(path).forEach((file) => {
        if(fs.existsSync(file) && fs.lstatSync(file).isDirectory()) {
            generateComponents(path+'/'+file);
        }
        else {
            //Do some code
        }
    });

}

Он работает для первой папки / каталога, но когда он переходит к следующему каталогу, он принимает как файлы, а условие переходит в другую часть. Я что-то не так делаю?

1 Ответ

4 голосов
/ 14 апреля 2020

Одной из проблем является то, что file в вашем коде это просто имя файла. Чтобы выполнить рекурсивный анализ, вы должны рекомбинировать имя файла с путем, чтобы вызвать generateComponents в каталоге, отличном от исходного пути. Это включает в себя, когда вы звоните fs.existsSync() и fs.lstatSync():

const path = require('path');

function generateComponents(dir) {
    fs.readdirSync(dir).forEach((file) => {
        let fullPath = path.join(dir, file);
        if (fs.lstatSync(fullPath).isDirectory()) {
            console.log(`directory: ${fullPath}`)
            generateComponents(fullPath);
        } else {
            console.log(`filename: ${fullPath}`)
            //Do some code
        }
    });
}

FYI, вы также должны использовать опцию withFileTypes для fs.readdirSync(), так как это сэкономит вам fs.lstatSync() вызов и fs.existsSync() звонить совершенно не нужно. fs.readdirSync() только что сказал, что файл был там, вам не нужно проверять, есть ли он снова.

Эта упрощенная версия с использованием withFileTypes будет выглядеть так:

const path = require('path');

function generateComponents(dir) {
    fs.readdirSync(dir, {withFileTypes: true}).forEach((entry) => {
        let fullPath = path.join(dir, entry.name);
        if (entry.isDirectory()) {
            console.log(`directory: ${fullPath}`)
            generateComponents(fullPath);
        } else if (entry.isFile()) {
            //Do some code with fullPath file
            console.log(`filename: ${fullPath}`)
        } else {
            // apparently there are some other things that could be here
            // like a symlink, so this is defensive coding
            console.log(`unexpected type: ${fullPath}`);
        }
    });
}
...