Обычная задача в серверном приложении — получить список файлов, существующих в каталоге, и затем выполнить с ними определенную задачу.
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 ❤️ Поддержите мою работу