Ich versuche, mit Node.js eine Liste der Namen aller Dateien zu erhalten, die in einem Verzeichnis vorhanden sind. Ich möchte eine Ausgabe, die ein Array von Dateinamen ist. Wie kann ich das machen?
Wie erhalten Sie eine Liste der Namen aller Dateien, die in einem Verzeichnis in Node.js vorhanden sind?
Umweltverschmutzung
Christian C. Salvado
Du kannst den … benutzen fs.readdir
oder fs.readdirSync
Methoden. fs
ist im Node.js-Kern enthalten, sodass Sie nichts installieren müssen.
fs.readdir
const testFolder="./tests/";
const fs = require('fs');
fs.readdir(testFolder, (err, files) => {
files.forEach(file => {
console.log(file);
});
});
fs.readdirSync
const testFolder="./tests/";
const fs = require('fs');
fs.readdirSync(testFolder).forEach(file => {
console.log(file);
});
Der Unterschied zwischen den beiden Methoden besteht darin, dass die erste asynchron ist, sodass Sie eine Callback-Funktion bereitstellen müssen, die ausgeführt wird, wenn der Leseprozess endet.
Die zweite ist synchron, sie gibt das Dateinamenarray zurück, stoppt jedoch jede weitere Ausführung Ihres Codes, bis der Lesevorgang beendet ist.
-
Notiz:
readdir
zeigt auch Verzeichnisnamen. Um diese zu filtern, verwenden Siefs.stat(path, callback(err, stats))
undstats.isDirectory()
.– Rob W
3. Juni 2012 um 14:31 Uhr
-
Ich sollte hinzufügen, dass Sie höchstwahrscheinlich mit readdire gehen sollten, da Sie IO im Knoten nicht blockieren möchten.
– Drachenritter
15. Oktober 2015 um 3:49 Uhr
-
@ user3705055, es sei denn, Sie verwenden gulp, um ein Verzeichnis mit von der Quellreihenfolge abhängigen Dateien einzulesen und sie in eine einzige ausführbare Datei zu kompilieren.
– r3wt
7. April 2016 um 20:59 Uhr
-
Für die neuere Versprechungsmethode siehe meine Antwort.
– KEIN KRIEG MIT RUSSLAND
30. Mai 2016 um 19:18 Uhr
-
@Sancarn Sie möchten versuchen, die Ausgabe von zu analysieren
ls
? Warten Sie einfach, bis jemand einige Dateinamen mit eingebetteten Leerzeichen und Zeilenumbrüchen erstellt …– Radon Rosborough
3. August 2017 um 22:11 Uhr
KFL
IMO ist der bequemste Weg, solche Aufgaben zu erledigen, a Kugel Werkzeug. Hier ist ein Glob-Paket für node.js. Mit installieren
npm install glob
Verwenden Sie dann Platzhalter, um Dateinamen abzugleichen (Beispiel aus Paket’s Webseite)
var glob = require("glob")
// options is optional
glob("**/*.js", options, function (er, files) {
// files is an array of filenames.
// If the `nonull` option is set, and nothing
// was found, then files is ["**/*.js"]
// er is an error object or null.
})
Wenn Sie vorhaben zu verwenden rund Hier ist ein Beispiel, um nach XML-Dateien zu suchen, die sich im aktuellen Ordner befinden
var globby = require('globby');
const paths = await globby("**/*.xml");
-
Dies war die beste Lösung für mich, da ich den Dateityp einfacher angeben wollte als Zeichenfolgenvergleiche. Danke.
– Pogrindis
26. Oktober 2014 um 20:09 Uhr
-
Wie erhalten Sie die Ergebnisse von
glob
außerhalb von sich? Z.B. Ich möchteconsole.log
die Ergebnisse, aber nicht im Innerenglob()
?– Lanti
8. Februar 2016 um 22:34 Uhr
-
@Lanti: Die
glob.sync(pattern, [options])
-Methode möglicherweise einfacher zu verwenden, da sie einfach ein Array von Dateinamen zurückgibt, anstatt einen Rückruf zu verwenden. Mehr Infos hier: github.com/isaacs/node-glob– Glenn Lawrence
7. Juni 2016 um 12:39 Uhr
-
Für Leute wie mich, die nach einer Glob-Implementierung mit Promises suchen, sehen Sie sich globby von sindresorhus an: github.com/sindresorhus/globby
– Nacho Coloma
23. Januar 2018 um 11:33 Uhr
-
Ich habe die Antwort mit dem Kommentar @NachoColoma aktualisiert und gezeigt, wie man sie verwendet
– Mauricio Gracia Gutiérrez
23. April 2021 um 2:50 Uhr
Ruben Tan
Die obige Antwort führt jedoch keine rekursive Suche im Verzeichnis durch. Folgendes habe ich für eine rekursive Suche getan (mit Knotenwanderung: npm install walk
)
var walk = require('walk');
var files = [];
// Walker options
var walker = walk.walk('./test', { followLinks: false });
walker.on('file', function(root, stat, next) {
// Add this file to the list of files
files.push(root + "https://stackoverflow.com/" + stat.name);
next();
});
walker.on('end', function() {
console.log(files);
});
-
fs.readdirSync ist besser, eine native Alternative, die speziell dafür erstellt wurde.
– Eraden
1. Juni 2012 um 10:30 Uhr
-
fs.readdirSync geht leider nicht in Unterverzeichnisse, es sei denn, Sie sind bereit, Ihre eigene Routine zu schreiben, um genau das zu tun, was Sie nicht tun, da es bereits npm-Module gibt, um genau dieses Problem zu lösen.
– Ruben Tan
2. Juni 2012 um 11:50 Uhr
-
Hier ist ein Link zum walk github repo + docs: github.com/coolaj86/node-walk
– santiagoIT
21. September 2012 um 0:11 Uhr
-
OP hat nicht gefragt, welche API rekursiv liest. In jedem Fall liefert die akzeptierte Antwort, was auch als Grundlage für ein rekursives Lesen dienen kann.
– Igwe Kalu
19. August 2015 um 8:53 Uhr
-
Dies ist eine fantastische Funktion. Kurze Frage: Gibt es eine schnelle Möglichkeit, bestimmte Verzeichnisse zu ignorieren? Ich möchte Verzeichnisse ignorieren, die mit beginnen
.git
– j_d
3. Mai 2016 um 12:14 Uhr
Tito100
Holen Sie sich Dateien in allen Unterverzeichnissen
const fs=require('fs');
function getFiles (dir, files_){
files_ = files_ || [];
var files = fs.readdirSync(dir);
for (var i in files){
var name = dir + "https://stackoverflow.com/" + files[i];
if (fs.statSync(name).isDirectory()){
getFiles(name, files_);
} else {
files_.push(name);
}
}
return files_;
}
console.log(getFiles('path/to/dir'))
Ali
Hier ist eine einfache Lösung, die nur das native verwendet fs
und path
Module:
// sync version
function walkSync(currentDirPath, callback) {
var fs = require('fs'),
path = require('path');
fs.readdirSync(currentDirPath).forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
walkSync(filePath, callback);
}
});
}
oder asynchrone Version (verwendet fs.readdir
stattdessen):
// async version with basic error handling
function walk(currentDirPath, callback) {
var fs = require('fs'),
path = require('path');
fs.readdir(currentDirPath, function (err, files) {
if (err) {
throw new Error(err);
}
files.forEach(function (name) {
var filePath = path.join(currentDirPath, name);
var stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath, stat);
} else if (stat.isDirectory()) {
walk(filePath, callback);
}
});
});
}
Dann rufen Sie einfach auf (für die Sync-Version):
walkSync('path/to/root/dir', function(filePath, stat) {
// do something with "filePath"...
});
oder asynchrone Version:
walk('path/to/root/dir', function(filePath, stat) {
// do something with "filePath"...
});
Der Unterschied besteht darin, wie der Knoten blockiert, während er die E/A ausführt. Da die obige API dieselbe ist, könnten Sie einfach die asynchrone Version verwenden, um maximale Leistung sicherzustellen.
Es gibt jedoch einen Vorteil bei der Verwendung der synchronen Version. Es ist einfacher, Code auszuführen, sobald der Walk abgeschlossen ist, wie in der nächsten Anweisung nach dem Walk. Bei der asynchronen Version benötigen Sie eine zusätzliche Möglichkeit, um zu wissen, wann Sie fertig sind. Vielleicht zuerst eine Karte aller Pfade erstellen und sie dann aufzählen. Für einfache Build/Utility-Skripte (im Vergleich zu Hochleistungs-Webservern) könnten Sie die Sync-Version verwenden, ohne Schaden anzurichten.
-
Sollte die Leitung ersetzen
walkSync
vonwalk(filePath, callback);
zuwalkSync(filePath, callback);
– MITTE11
7. Februar 2016 um 13:01 Uhr
-
Aber Sie verwenden immer noch fs.statSync, das blockiert, in der asynchronen Version. Sollten Sie nicht stattdessen fs.stat verwenden?
– Unterschiedliches Pseudonym
19. Juni 2016 um 23:14 Uhr
bnp887
Ab Node v10.10.0 ist es möglich, die neue zu verwenden withFileTypes
Option für fs.readdir
und fs.readdirSync
in Kombination mit der dirent.isDirectory()
Funktion zum Filtern nach Dateinamen in einem Verzeichnis. Das sieht so aus:
fs.readdirSync('./dirpath', {withFileTypes: true})
.filter(item => !item.isDirectory())
.map(item => item.name)
Das zurückgegebene Array hat die Form:
['file1.txt', 'file2.txt', 'file3.txt']
-
Sollte die Leitung ersetzen
walkSync
vonwalk(filePath, callback);
zuwalkSync(filePath, callback);
– MITTE11
7. Februar 2016 um 13:01 Uhr
-
Aber Sie verwenden immer noch fs.statSync, das blockiert, in der asynchronen Version. Sollten Sie nicht stattdessen fs.stat verwenden?
– Unterschiedliches Pseudonym
19. Juni 2016 um 23:14 Uhr
Promises mit ES7 verwenden
Asynchrone Nutzung mit mz/fs
Die mz
-Modul stellt versprochene Versionen der Core-Node-Bibliothek bereit. Ihre Verwendung ist einfach. Installieren Sie zuerst die Bibliothek …
npm install mz
Dann…
const fs = require('mz/fs');
fs.readdir('./myDir').then(listing => console.log(listing))
.catch(err => console.error(err));
Alternativ können Sie sie in asynchronen Funktionen in ES7 schreiben:
async function myReaddir () {
try {
const file = await fs.readdir('./myDir/');
}
catch (err) { console.error( err ) }
};
Update für rekursive Auflistung
Einige der Benutzer haben den Wunsch angegeben, eine rekursive Auflistung zu sehen (wenn auch nicht in der Frage) … Verwenden fs-promise
. Es ist eine dünne Hülle herum mz
.
npm install fs-promise;
dann…
const fs = require('fs-promise');
fs.walk('./myDir').then(
listing => listing.forEach(file => console.log(file.path))
).catch(err => console.error(err));
-
fs.walk wurde aus fs-promise entfernt, da es von fs nicht unterstützt wird ( github.com/kevinbeaty/fs-promise/issues/28 )
– Adnan
1. Mai 2017 um 9:49 Uhr
fs.readdir
funktioniert, kann aber keine Glob-Muster für Dateinamen wie verwendenls /tmp/*core*
. Kasse github.com/isaacs/node-glob. Globs können sogar in Unterverzeichnissen suchen.– Jess
2. Dezember 2013 um 17:32 Uhr
Überprüfen Sie die NPMs
readdir-recursive
Modul, wenn Sie auch nach den Namen von Dateien in Unterverzeichnissen suchen– Ethan Davis
10. Juni 2016 um 23:00 Uhr
es7-Methode mit await here
– KEIN KRIEG MIT RUSSLAND
28. April 2017 um 21:58 Uhr
fs.readdir ist eine einfache asynchrone Lösung – Beispiele Hier
– drorw
18. April 2019 um 20:49 Uhr
Antworten Sie immer noch nicht mit einem Iterator? Ich muss 2,5 Millionen Dateien scannen … Ich möchte nicht nach 10 Minuten eine Liste mit 2,5 m Pfaden erhalten.
– Flavien Volken
13. Mai 2019 um 20:17 Uhr