<MyRusakov.ru />

Разработчик игр на Unreal Engine

Разработчик игр на Unreal Engine

Этот комплект с нуля всего за 7 месяцев сделает Вас Unreal-разработчиком. И при этом учиться достаточно 1 час в день.

Начнёте Вы с основ программирования, постепенно перейдя к C++. Затем очень подробно изучите Unreal Engine, и после научитесь программировать на C++ в Unreal Engine. В конце создадите крупный проект на C++ в Unreal Engine для своего портфолио.

Комплект содержит:

- 416 видеоуроков

- 95 часов видео

- 1024 задания для закрепления материала из уроков

- 3 финальных тестирования

- 4 сертификата

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Рекурсивное чтение папки в NodeJS

Рекурсивное чтение папки в NodeJS

Одной из самых частых задач при работе с каталогами (директориями) в NodeJS является их рекурсивное чтение. Что это такое? Например, у вас есть папка, а в ней еще папка, а в ней еще - и так далее. И Вам необходимо прочитать содержимое корневой папки и всех дочерних, причем уровень вложенности может быть сколь угодно произвольным. Для того, чтобы вывести содержимое всех папок как раз и понадобится рекурсия - вызов функцией самой себя.

В примере кода для NodeJS ниже я покажу Вам как этого можно добиться.

Первый пример


/**
 * Принимает функцию вида (err, value) => {}
 * и возвращает ее в виде обещания (промиса).
 */
const { promisify } = require('util');

/**
 * в комментарии к коду ниже есть описание данной функции
 */
const { resolve } = require('path');
const fs = require('fs');
const readdir = promisify(fs.readdir); // промифицирует функцию readdir
const stat = promisify(fs.stat); // тоже самое что и выше, только c stat

/**
 * Рекурсивно обходит папку и возвращает все найденные в ней файлы 
 * в виде одномерного массива абсолютный путей
 * 
 * @param {string} dir Корневая папка
 * @returns {Promise<string[]>} массив строк - путей к файлам
 */
async function getFiles(dir) {

    // асинхронно читает содержимое директории
    const subfolders = await readdir(dir);

    // возвращает список всех путей к файлам
    const files = await Promise.all(subfolders.map(async (subfolder) => {

        // преобразует путь к файлу из относительного в абсолютный
        const res = resolve(dir, subfolder);

        // проверяет директория или файл
        // если директория - рекурсивно вызывает саму себя
        // в противном случае возвращает файл в массив
        return (await stat(res)).isDirectory() ? getFiles(res) : res;
    }));

    // преобразует многомерный полученный массив путей в одномерный
    return files.reduce((a, f) => a.concat(f), []);
}


// запускаем с текущей директорией
getFiles(__dirname)
  .then(files => console.log(files)) // выводим массив путей
  .catch(e => console.error(e)); // или ошибки в консоль

Второй пример:


const { resolve } = require('path');
const { readdir } = require('fs').promises; // промифицированная версия функций из метода

/**
 * 
 * @param {stirng} dir папка, с которой начинается сканирование
 * @returns {Promise<stirng[]>}
 */
async function getFiles(dir) {

    // читаем содержимое директории
    const dirents = await readdir(dir, { withFileTypes: true });

    // как и в прошлом примере проходимся по папкам
    // и, при необходимости рекурсивно вызываем функцию
    const files = await Promise.all(dirents.map((dirent) => {
        const res = resolve(dir, dirent.name);
        return dirent.isDirectory() ? getFiles(res) : res;
    }));

    // преобразуем массив файлов в одномерный
    return Array.prototype.concat(...files);
}


// тестируем
getFiles(__dirname)
    .then(files => console.log(files))
    .catch(err => console.error(err))

Вот таким образом, можно рекурсивно обойти все директории и найти полные пути ко всем файлам в NodeJS.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.