Ich versuche, einen vollständigen Pfad zu erstellen, wenn er nicht vorhanden ist.
Der Code sieht folgendermaßen aus:
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest);
Dieser Code funktioniert hervorragend, solange es nur ein Unterverzeichnis gibt (ein newDest wie 'dir1'). Wenn es jedoch einen Verzeichnispfad wie ('dir1 / dir2') gibt, schlägt er mit Fehler: ENOENT fehl, keine solche Datei oder kein solches Verzeichnis
Ich möchte in der Lage sein, den vollständigen Pfad mit so wenigen Codezeilen wie nötig zu erstellen.
Ich habe gelesen, dass es eine rekursive Option für fs gibt und habe es so versucht
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);
Ich denke, es sollte so einfach sein, rekursiv ein Verzeichnis zu erstellen, das es nicht gibt. Fehlt mir etwas oder muss ich den Pfad analysieren, jedes Verzeichnis überprüfen und erstellen, falls es noch nicht vorhanden ist?
Ich bin ziemlich neu bei Node. Vielleicht verwende ich eine alte Version von FS?
Antworten:
Eine Möglichkeit ist die Verwendung des ShellJS-Moduls
npm installiere shelljs
Von dieser Seite:
Wie andere angemerkt haben, gibt es andere fokussiertere Module. Außerhalb von mkdirp gibt es jedoch unzählige andere nützliche Shell-Operationen (wie welche, grep usw.) und es funktioniert unter Windows und * nix
quelle
Bearbeiten
Die NodeJS-Version
10.12.0
hat eine native Unterstützung für beide hinzugefügtmkdir
undmkdirSync
zum rekursiven Erstellen eines Verzeichnisses mitrecursive: true
der folgenden Option:Und wenn Sie es vorziehen
fs Promises API
, können Sie schreibenUrsprüngliche Antwort
Erstellen Sie Verzeichnisse rekursiv, wenn sie nicht vorhanden sind! ( Null Abhängigkeiten )
Verwendung
Demo
Versuch es!
Erklärungen
EISDIR
für Mac undEPERM
undEACCES
für Windows. Vielen Dank an alle Berichtskommentare von @PediT., @JohnQ, @ deed02392, @robyoder und @Almenon.{isRelativeToScript: true}
.path.sep
undpath.resolve()
nicht nur/
Verketten, um plattformübergreifende Probleme zu vermeiden.fs.mkdirSync
und Behandeln des Fehlers mit,try/catch
wenn er ausgelöst wird, um die Rennbedingungen zu behandeln: Ein anderer Prozess kann die Datei zwischen den Aufrufen vonfs.existsSync()
und hinzufügenfs.mkdirSync()
und eine Ausnahme verursachen.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. H. Dies ist jedoch ein Anti-Pattern, das den Code für Rennbedingungen anfällig macht. Dank @GershomMaes Kommentar zur Verzeichnis-Existenzprüfung.quelle
Eine robustere Antwort ist die Verwendung von mkdirp .
Schreiben Sie dann die Datei in den vollständigen Pfad mit:
quelle
fs-extra fügt Dateisystemmethoden hinzu, die nicht im nativen fs-Modul enthalten sind. Es ist ein Rückgang des Ersatzes für fs.
Installieren
fs-extra
$ npm install --save fs-extra
Es gibt Synchronisierungs- und Asynchronisierungsoptionen.
https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md
quelle
memfs
für Unit-Tests zu verwenden. Es tut nicht :-( github.com/jprichardson/node-fs-extra/issues/274Mit reduzieren können wir überprüfen, ob jeder Pfad vorhanden ist, und ihn bei Bedarf erstellen. Auch auf diese Weise ist es meiner Meinung nach einfacher, ihm zu folgen. Dank @Arvin bearbeitet, sollten wir path.sep verwenden, um das richtige plattformspezifische Trennzeichen für Pfadsegmente zu erhalten.
quelle
Diese Funktion wurde in Version 10.12.0 zu node.js hinzugefügt, sodass es so einfach ist, eine Option
{recursive: true}
als zweites Argument an denfs.mkdir()
Aufruf zu übergeben. Siehe das Beispiel in den offiziellen Dokumenten .Keine Notwendigkeit für externe Module oder Ihre eigene Implementierung.
quelle
Ich weiß, dass dies eine alte Frage ist, aber nodejs v10.12.0 unterstützt dies jetzt nativ mit der
recursive
Option true. fs.mkdirquelle
Jetzt mit NodeJS> =
10.12.0
, können Siefs.mkdirSync(path, { recursive: true })
fs.mkdirSyncquelle
Beispiel für Windows (keine zusätzlichen Abhängigkeiten und Fehlerbehandlung)
quelle
Sie können einfach rekursiv überprüfen, ob ein Ordner vorhanden ist oder nicht, und den Ordner erstellen, während Sie prüfen, ob er nicht vorhanden ist. ( KEINE EXTERNE BIBLIOTHEK )
quelle
Sie können die nächste Funktion verwenden
const recursiveUpload = (Pfad: Zeichenfolge) => {const path = path.split ("/")
Also, was es tut:
paths
Variable, in der jeder Pfad für sich als Element des Arrays gespeichert wird.Hoffentlich hilft das!
Übrigens können Sie in Node v10.12.0 die rekursive Pfaderstellung verwenden, indem Sie sie als zusätzliches Argument angeben.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => { if (err) throw err; });
https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options
quelle
Zu viele Antworten, aber hier ist eine Lösung ohne Rekursion, bei der der Pfad aufgeteilt und dann von links nach rechts wieder aufgebaut wird
Für diejenigen, die sich Gedanken über die Kompatibilität von Windows und Linux machen, ersetzen Sie einfach den Schrägstrich durch doppelten Backslash '\' in beiden oben genannten Fällen, aber TBH, wir sprechen über den Knoten fs, nicht über die Windows-Befehlszeile, und der erstere ist ziemlich verzeihend, und der obige Code funktioniert einfach Windows und ist eher eine plattformübergreifende Komplettlösung.
quelle
path.sep
kommt als entweder / oder \\ für mich durch.path.delimiter
ist oder ;.quelle
Eine asynchrone Methode zum rekursiven Erstellen von Verzeichnissen:
quelle
Hier ist meine zwingende Version von
mkdirp
für nodejs.quelle
Wie wäre es mit diesem Ansatz:
Dies funktioniert für den relativen Pfad.
quelle
Basierend auf der Null-Abhängigkeits-Antwort von mouneer gibt es hier eine etwas anfängerfreundlichere
Typescript
Variante als Modul:quelle
So sauber wie das :)
quelle
Ich hatte Probleme mit der rekursiven Option von fs.mkdir, also habe ich eine Funktion erstellt, die Folgendes ausführt:
Macht jedes benötigte Verzeichnis, einschließlich des Finales
quelle
Exec kann unter Windows chaotisch sein. Es gibt eine "Nodie" -Lösung. Grundsätzlich haben Sie einen rekursiven Aufruf, um festzustellen, ob ein Verzeichnis vorhanden ist, und in das untergeordnete Verzeichnis einzutauchen (falls vorhanden) oder es zu erstellen. Hier ist eine Funktion, die die untergeordneten Elemente erstellt und nach Abschluss eine Funktion aufruft:
}}
quelle
Diese Version funktioniert unter Windows besser als die Top-Antwort, da sie beide versteht
/
undpath.sep
Schrägstriche unter Windows so funktionieren, wie sie sollten. Unterstützt absolute und relative Pfade (relativ zuprocess.cwd
).quelle