J'espérais que ce serait une chose simple, mais je ne trouve rien pour le faire.
Je veux juste obtenir tous les dossiers / répertoires dans un dossier / répertoire donné.
Ainsi, par exemple:
<MyFolder>
|- SomeFolder
|- SomeOtherFolder
|- SomeFile.txt
|- SomeOtherFile.txt
|- x-directory
Je m'attendrais à obtenir un tableau de:
["SomeFolder", "SomeOtherFolder", "x-directory"]
Ou ce qui précède avec le chemin si c'était comme ça qu'il était servi ...
Existe-t-il déjà quelque chose pour faire ce qui précède?
require('path').resolve(__dirname, file)
const getDirectories = srcPath => fs.readdirSync(srcPath).filter(file => fs.statSync(path.join(srcPath, file)).isDirectory())
lstatSync
plutôt.Grâce aux fonctionnalités de syntaxe JavaScript ES6 (ES2015), il s'agit d'un seul revêtement:
Version synchrone
Version asynchrone pour Node.js 10+ (expérimental)
la source
Répertorie les répertoires à l'aide d'un chemin.
la source
Solution récursive
Je suis venu ici à la recherche d'un moyen d'obtenir tous les sous-répertoires et tous leurs sous-répertoires, etc. En s'appuyant sur la réponse acceptée , j'ai écrit ceci:
la source
if (recursive) return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; else return [...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; }
Cela devrait le faire:
CoffeeScript (synchronisation)
CoffeeScript (async)
JavaScript (async)
la source
fs
méthodes synchrones .(err, dirs)
); il ne rappellera pas en présence de fichiers ou dossiers dot; il est sensible à toutes les conditions de course; il peut rappeler avant d'avoir vérifié toutes les entrées.Alternativement, si vous pouvez utiliser des bibliothèques externes, vous pouvez utiliser
filehound
. Il prend en charge les rappels, les promesses et les appels de synchronisation.Utiliser des promesses:
Utilisation des rappels:
Appel de synchronisation:
Pour plus d'informations (et des exemples), consultez les documents: https://github.com/nspragg/filehound
Avertissement: je suis l'auteur.
la source
Avec la version node.js> = v10.13.0, fs.readdirSync renverra un tableau d' objets fs.Dirent si l'
withFileTypes
option est définie surtrue
.Vous pouvez donc utiliser,
la source
.filter(c => c.isDirectory())
serait plus simple que d'utiliserreduce()
.filter(c => c.isDirectory()).map(c => c.name)
l'reduce
appel.la source
Utilisation de fs-extra, qui promet les appels asynchrones fs, et la nouvelle syntaxe async en attente:
la source
Et une version asynchrone de getDirectories, vous avez besoin du module asynchrone pour cela:
la source
Cette réponse n'utilise pas de fonctions de blocage comme
readdirSync
oustatSync
. Il n'utilise pas de dépendances externes et ne se retrouve pas dans les profondeurs de l'enfer de rappel.Au lieu de cela, nous utilisons des fonctionnalités JavaScript modernes comme les promesses et les
async-await
syntaxes. Et les résultats asynchrones sont traités en parallèle; pas séquentiellement -Je vais installer un exemple de package, puis tester notre fonction -
Voyons voir ça marche -
En utilisant un module généralisé
Parallel
, nous pouvons simplifier la définition dedirs
-Le
Parallel
module utilisé ci-dessus était un modèle extrait d'un ensemble de fonctions conçues pour résoudre un problème similaire. Pour plus d'explications, consultez ces questions et réponses connexes .la source
Version CoffeeScript de cette réponse , avec une gestion correcte des erreurs:
Dépend de l' async
Sinon, utilisez un module pour cela! (Il y a des modules pour tout. [Citation nécessaire])
la source
Si vous devez utiliser toutes les
async
versions. Vous pouvez avoir quelque chose comme ça.Enregistrez la longueur du répertoire, utilisez-la comme indicateur pour savoir si toutes les tâches de statistiques asynchrones sont terminées.
Si les tâches de statistiques asynchrones sont terminées, toutes les statistiques du fichier ont été vérifiées, appelez donc le rappel
Cela ne fonctionnera que tant que Node.js est un thread unique, car il suppose qu'aucune tâche asynchrone n'augmentera le compteur en même temps.
Comme vous pouvez le voir, il s'agit d'une approche "en profondeur d'abord", et cela pourrait entraîner un enfer de rappel, et ce n'est pas tout à fait "fonctionnel". Les gens essaient de résoudre ce problème avec Promise, en encapsulant la tâche asynchrone dans un objet Promise.
la source
utiliser le module de chemin fs can peut obtenir le dossier. cette promesse d'utilisation. Si vous obtiendrez le remplissage, vous pouvez remplacer isDirectory () par isFile () Nodejs - fs - fs.Stats .Enfin, vous pouvez obtenir le fichier'name file'extname et ainsi de suite Nodejs --- Path
la source
Version entièrement asynchrone avec ES6, seuls les packages natifs, fs.promises et async / attendent, effectuent les opérations de fichiers en parallèle:
Testé, cela fonctionne bien.
la source
Juste au cas où quelqu'un d'autre se retrouverait ici à partir d'une recherche sur le Web et aurait déjà Grunt dans sa liste de dépendances, la réponse à cela deviendrait triviale. Voici ma solution:
la source
Une autre approche récursive
Merci à Mayur de m'avoir connu
withFileTypes
. J'ai écrit le code suivant pour obtenir les fichiers d'un dossier particulier récursivement. Il peut être facilement modifié pour n'obtenir que des répertoires.la source
programmation fonctionnelle
la source