Wie erhalten Sie eine Liste der Namen aller Dateien, die in einem Verzeichnis in Node.js vorhanden sind?

Lesezeit: 8 Minuten

Wie erhalten Sie eine Liste der Namen aller Dateien die
Umweltverschmutzung

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?

  • fs.readdir funktioniert, kann aber keine Glob-Muster für Dateinamen wie verwenden ls /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

1646436911 618 Wie erhalten Sie eine Liste der Namen aller Dateien die
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 Sie fs.stat(path, callback(err, stats)) und stats.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

1646436912 548 Wie erhalten Sie eine Liste der Namen aller Dateien die
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öchte console.log die Ergebnisse, aber nicht im Inneren glob()?

    – 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

1646436912 864 Wie erhalten Sie eine Liste der Namen aller Dateien die
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

Wie erhalten Sie eine Liste der Namen aller Dateien die
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'))

Wie erhalten Sie eine Liste der Namen aller Dateien die
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 von walk(filePath, callback); zu walkSync(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

1646436914 467 Wie erhalten Sie eine Liste der Namen aller Dateien die
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']

Dokumente für die fs.Dirent-Klasse

  • Sollte die Leitung ersetzen walkSync von walk(filePath, callback); zu walkSync(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));

939940cookie-checkWie erhalten Sie eine Liste der Namen aller Dateien, die in einem Verzeichnis in Node.js vorhanden sind?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy