async
Вот высоко оптимизированная версия, использующая быстрые * Node fs.Dirent объекты Node. Этот подход позволяет пропустить дорогостоящие вызовы fs.existsSync
и fs.statSync
на каждом пути -
const { readdir } =
require ("fs")
const { join } =
require ("path")
const dirs = async (path = ".") =>
Promise.all
( (await readdir (path, { withFileTypes: true }))
.map
( dirent =>
dirent .isDirectory ()
? dirs (join (path, dirent.name))
: []
)
)
.then
( results =>
[] .concat (path, ...results)
)
Вы используете его следующим образом -
dirs ("MyFolder") .then (console.log, console.error)
sync
Мы можем переписать вышеуказанную функцию, используя вместо этого синхронные функции -
const { readdirSync } =
require ("fs")
const { join } =
require ("path")
const dirsSync = (path = ".") =>
[].concat
( path
, ...readdirSync (path, { withFileTypes: true })
.map
( dirent =>
dirent .isDirectory ()
? dirsSync (join (path, dirent.name))
: []
)
)
Вы можете использовать ее следующим образом -
console .log (dirsSync ("MyFolder"))
Это может быть еще более упрощеноиспользуя Array.prototype.flatMap
-
const { readdirSync } =
require ("fs")
const { join } =
require ("path")
const dirsSync = (path = ".") =>
[ path
, ...readdirSync (path, { withFileTypes: true })
.flatMap
( dirent =>
dirent .isDirectory ()
? dirsSync (join (path, dirent.name))
: []
)
]