Ich hatte gehofft, dass dies eine einfache Sache sein würde, aber ich kann dort nichts herausfinden, um dies zu tun.
Ich möchte nur alle Ordner / Verzeichnisse in einem bestimmten Ordner / Verzeichnis abrufen.
Also zum Beispiel:
<MyFolder>
|- SomeFolder
|- SomeOtherFolder
|- SomeFile.txt
|- SomeOtherFile.txt
|- x-directory
Ich würde erwarten, eine Reihe von:
["SomeFolder", "SomeOtherFolder", "x-directory"]
Oder das obige mit dem Pfad, wenn es so serviert wurde ...
Gibt es also schon etwas, um das oben Genannte zu tun?
require('path').resolve(__dirname, file)
const getDirectories = srcPath => fs.readdirSync(srcPath).filter(file => fs.statSync(path.join(srcPath, file)).isDirectory())
lstatSync
stattdessen.Dank der Syntaxfunktionen von JavaScript ES6 (ES2015) ist es ein Liner:
Synchrone Version
Asynchrone Version für Node.js 10+ (experimentell)
quelle
Listen Sie Verzeichnisse mit einem Pfad auf.
quelle
Rekursive Lösung
Ich bin hierher gekommen, um nach einem Weg zu suchen, um alle Unterverzeichnisse und alle ihre Unterverzeichnisse usw. abzurufen. Aufbauend auf der akzeptierten Antwort schrieb ich Folgendes:
quelle
if (recursive) return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; else return [...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))]; }
Dies sollte es tun:
CoffeeScript (synchronisieren)
CoffeeScript (asynchron)
JavaScript (asynchron)
quelle
fs
Methoden unbedingt vermeiden .(err, dirs)
); Bei Vorhandensein von Punktdateien oder Ordnern wird es nicht zurückgerufen. es ist anfällig für alle Rennbedingungen; Es kann zurückrufen, bevor alle Einträge überprüft wurden.Wenn Sie externe Bibliotheken verwenden können, können Sie diese auch verwenden
filehound
. Es unterstützt Rückrufe, Versprechen und Synchronisierungsanrufe.Versprechen verwenden:
Rückrufe verwenden:
Anruf synchronisieren:
Weitere Informationen (und Beispiele) finden Sie in den Dokumenten: https://github.com/nspragg/filehound
Haftungsausschluss: Ich bin der Autor.
quelle
Mit node.js version> = v10.13.0 gibt fs.readdirSync ein Array von fs.Dirent- Objekten zurück, wenn die
withFileTypes
Option auf gesetzt isttrue
.So können Sie verwenden,
quelle
.filter(c => c.isDirectory())
wäre einfacher als zu verwendenreduce()
.filter(c => c.isDirectory()).map(c => c.name)
denreduce
Anruf trotzdem vorziehen .quelle
Verwenden von fs-extra, das die asynchronen fs-Aufrufe verspricht, und der neuen Async-Syntax zum Warten:
quelle
Für eine asynchrone Version von getDirectories benötigen Sie dazu das asynchrone Modul :
quelle
Diese Antwort verwendet keine Blockierungsfunktionen wie
readdirSync
oderstatSync
. Es verwendet weder externe Abhängigkeiten noch befindet es sich in den Tiefen der Callback-Hölle.Stattdessen verwenden wir moderne JavaScript-Funktionen wie Promises und
async-await
Syntax. Asynchrone Ergebnisse werden parallel verarbeitet. nicht nacheinander -Ich werde ein Beispielpaket installieren und dann unsere Funktion testen -
Mal sehen, wie es funktioniert -
Mit einem verallgemeinerten Modul können
Parallel
wir die Definition vondirs
- vereinfachenDas
Parallel
oben verwendete Modul war ein Muster, das aus einer Reihe von Funktionen extrahiert wurde, um ein ähnliches Problem zu lösen. Weitere Erläuterungen finden Sie in den entsprechenden Fragen und Antworten .quelle
CoffeeScript-Version dieser Antwort mit korrekter Fehlerbehandlung:
Kommt auf Async an
Alternativ können Sie hierfür ein Modul verwenden! (Es gibt Module für alles. [Zitieren erforderlich])
quelle
Wenn Sie alle
async
Versionen verwenden müssen. Sie können so etwas haben.Notieren Sie die Verzeichnislänge und verwenden Sie sie als Indikator, um festzustellen, ob alle asynchronen Statistikaufgaben abgeschlossen sind.
Wenn die Aufgaben für den asynchronen Status abgeschlossen sind, wurde der gesamte Dateistatus überprüft. Rufen Sie daher den Rückruf auf
Dies funktioniert nur, solange Node.js ein einzelner Thread ist, da davon ausgegangen wird, dass keine zwei asynchronen Tasks gleichzeitig den Zähler erhöhen.
Wie Sie sehen können, handelt es sich hierbei um einen "Tiefe zuerst" -Ansatz, der zur Rückrufhölle führen kann und nicht ganz "funktionsfähig" ist. Die Leute versuchen, dieses Problem mit Promise zu lösen, indem sie die asynchrone Aufgabe in ein Promise-Objekt einbinden.
quelle
Verwenden Sie das Pfadmodul fs 、, um den Ordner zu erhalten. diese verwenden Versprechen. Wenn Sie die Füllung erhalten, können Sie isDirectory () in isFile () ändern. Nodejs - fs - fs.Stats . Zuletzt können Sie den Dateinamen, den Dateinamen und so weiter abrufen
quelle
Die vollständig asynchrone Version mit ES6, nur native Pakete, fs.promises und async / await, führt Dateivorgänge parallel aus:
Getestet funktioniert es gut.
quelle
Nur für den Fall, dass jemand anderes von einer Websuche hierher kommt und Grunt bereits in seiner Abhängigkeitsliste hat, wird die Antwort darauf trivial. Hier ist meine Lösung:
quelle
Ein weiterer rekursiver Ansatz
Vielen Dank an Mayur, der mich kennengelernt hat
withFileTypes
. Ich habe folgenden Code geschrieben, um Dateien eines bestimmten Ordners rekursiv abzurufen. Es kann leicht geändert werden, um nur Verzeichnisse zu erhalten.quelle
funktionale Programmierung
quelle