Как прочитать все файлы в каталоге с помощью Node?

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

Nodejs предлагает API, позволяющий работать с файлами, включая возможность читать содержимое каталога синхронно и асинхронно (с обратными вызовами или обещаниями).

/* Leer el contenido de un directorio de forma sincrona */

// files es un arreglo con los nombres de los archivos dentro del directorio
import fs from 'node:fs'
const files = fs.readdirSync('./mi-directorio') 



/* Leer el contenido de un directorio de forma asincrona usando callbacks*/
import fs from 'node:fs'
let files = []
fs.readdir('./mi-directorio',(err, result) => {
  if(err) {
    console.error(err)
    throw Error(err)
  }
  files = result
}) 


/* Leer el contenido de un directorio de forma asincrona usando promesas*/
import fs from 'node:fs'

const files = await fs.promises.readdir('./mi-directorio')
Войдите в полноэкранный режим Выход из полноэкранного режима

Но это вернет только список файлов и каталогов «первого уровня», т.е. если у вас структура каталогов такая:

Результат будет:

[
  'node_modules',
  'public',
  'src',
  '.gitignore',
  'package.json',
  'README.md'
]
Войдите в полноэкранный режим Выход из полноэкранного режима

Как получить все файлы, включая подкаталоги?

Рекурсия — вот ответ:

async function readAllFiles(path, arrayOfFiles = []){
    const files = fs.readdirSync(path)
    files.forEach(file => {
        const stat = fs.statSync(`${path}/${file}`)
        if(stat.isDirectory()){
            readAllFiles(`${path}/${file}`, arrayOfFiles)
        }else{
            arrayOfFiles.push(`${path}/${file}`)
        }
    }
    )
    return arrayOfFiles
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Приведенная выше функция выполняет чтение содержимого каталога


const file = fs.readdirSync(path)

Войдите в полноэкранный режим Выход из полноэкранного режима

Затем для каждого элемента в возвращаемом массиве files.forEach проверяется, является ли этот элемент каталогом.


const stat = fs.statSync(`${path}/${file}`)

if(stat.isDirectory())

Войдите в полноэкранный режим Выход из полноэкранного режима

Если это каталог, то выполняется рекурсивный вызов, изменяя первый аргумент на текущий каталог.


readAllFiles(`${path}/${file}`, arrayOfFiles)

Войдите в полноэкранный режим Выход из полноэкранного режима

В противном случае он просто сохраняет файл в массиве arrayOfFiles.

Таким образом, результатом чтения приведенной выше структуры каталогов будет


[  
    ................  
    'public/favicon.ico',

    'public/index.html,

    'public/robots.txt',  
    'src/index.css',

    'src/index.js',  
    '.gitignore',  
    'package.json',  
    'README.md'  
]

Войдите в полноэкранный режим Выход из полноэкранного режима


✉️ Присоединяйтесь к Micro-bytes 🐦 Следите за мной в Twitter ❤️ Поддержите мою работу

Оцените статью
devanswers.ru
Добавить комментарий