Ich habe bereits die Dokumentation von Node.js gelesen und es sei denn, ich habe etwas verpasst, es sagt nicht aus, was die Parameter insbesondere in bestimmten Operationen enthalten fs.mkdir()
. Wie Sie in der Dokumentation sehen können, ist es nicht sehr viel.
Derzeit habe ich diesen Code, der versucht, einen Ordner zu erstellen oder stattdessen einen vorhandenen zu verwenden:
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
Aber ich frage mich, ob dies der richtige Weg ist? Ist das Überprüfen des Codes EEXIST
der richtige Weg, um festzustellen, dass der Ordner bereits vorhanden ist? Ich weiß, dass ich das tun kann, fs.stat()
bevor ich das Verzeichnis erstelle, aber das wären bereits zwei Treffer für das Dateisystem.
Zweitens gibt es eine vollständige oder zumindest detailliertere Dokumentation von Node.js, die Details darüber enthält, welche Fehlerobjekte enthalten, welche Parameter bedeuten usw.
quelle
e &&
. Wenn dies!e
fehlschlägt, wissen Sie, dasse
es wahr ist.Antworten:
Ein guter Weg, dies zu tun, ist die Verwendung des Moduls mkdirp .
Verwenden Sie diese Option, um eine Funktion auszuführen, für die das Verzeichnis erforderlich ist. Der Rückruf wird aufgerufen, nachdem der Pfad erstellt wurde oder wenn der Pfad bereits vorhanden war. Der Fehler
err
wird gesetzt, wenn mkdirp den Verzeichnispfad nicht erstellen konnte.quelle
fs.exists(Sync)
.Bearbeiten: Da diese Antwort sehr beliebt ist, habe ich sie aktualisiert, um aktuelle Praktiken widerzuspiegeln.
Knoten> = 10
Die neue
{ recursive: true }
Option von Node'sfs
ermöglicht dies jetzt nativ. Diese Option ahmt das Verhalten von UNIX nachmkdir -p
. Es stellt rekursiv sicher, dass jeder Teil des Pfads vorhanden ist, und gibt keinen Fehler aus, wenn einer von ihnen dies tut.(Hinweis: Es kann immer noch Fehler wie
EPERM
oderEACCESS
auslösen, also wickeln Sie es besser in ein,try {} catch (e) {}
wenn Ihre Implementierung dafür anfällig ist.)Synchrone Version.
Asynchrone Version
Ältere Knotenversionen
Mit a
try {} catch (err) {}
können Sie dies sehr elegant erreichen, ohne auf eine Rennbedingung zu stoßen.Um eine Totzeit zwischen der Überprüfung der Existenz und der Erstellung des Verzeichnisses zu vermeiden, versuchen wir einfach, es direkt zu erstellen, und ignorieren den Fehler, falls dies der Fall ist
EEXIST
(Verzeichnis existiert bereits).Wenn der Fehler jedoch nicht
EEXIST
vorliegt, sollten wir einen Fehler auslösen, da es sich möglicherweise um einEPERM
oder handeltEACCES
Für
mkdir -p
-ähnlichen rekursive Verhalten, zum Beispiel./a/b/c
, würden Sie sie auf jedem Teil der dirpath nennen müssen, zum Beispiel./a
,./a/b
,.a/b/c
quelle
Wenn Sie einen schnell und schmutzigen Einzeiler wünschen, verwenden Sie diesen:
quelle
fs.exists
ist veraltet: nodejs.org/api/fs.html#fs_fs_exists_path_callbackDie docs von node.js für werden
fs.mkdir
grundsätzlich auf die Linux-Manpage für verschobenmkdir(2)
. Dies zeigt an, dass diesEEXIST
auch angezeigt wird, wenn der Pfad vorhanden ist, es sich jedoch nicht um ein Verzeichnis handelt, das bei dieser Route einen unangenehmen Eckfall erzeugt.Sie können besser anrufen
fs.stat
, um festzustellen, ob der Pfad vorhanden ist und ob es sich um ein Verzeichnis in einem einzelnen Aufruf handelt. Für den Normalfall, in dem das Verzeichnis bereits vorhanden ist, handelt es sich nur um einen einzigen Dateisystem-Treffer.Bei diesen
fs
Modulmethoden handelt es sich um Thin Wrapper um die nativen C-APIs. Sie müssen daher die Manpages überprüfen, auf die in den Dokumenten von node.js verwiesen wird, um Einzelheiten zu erfahren.quelle
stat
bevormkdir
das Potenzial für eine Race - Bedingung hat - dies im Auge behalten.Sie können dies verwenden:
quelle
statSync
wird einen Fehler auslösen, wenn die Entität überhaupt nicht existiert und den Code zum Absturz bringt. Sie müssen dies in einentry/catch
Block einschließen.fs.existsSync()
undfs.exists()
wird als veraltet.Ich schlage eine Lösung ohne Module vor (das Sammeln von Modulen wird aus Gründen der Wartbarkeit niemals empfohlen, insbesondere für kleine Funktionen, die in wenigen Zeilen geschrieben werden können ...):
LETZTES UPDATE :
In Version 10.12.0 implementieren NodeJS rekursive Optionen:
UPDATE:
quelle
fs.exists()
ist in Knoten v9 veraltet. Verwenden Siefs.access()
stattdessen. (undefined
ENOENT
fs.mkdirSync('my/new/folder/create', {recursive: true})
?Sie können auch fs-extra verwenden , das häufig verwendete Dateivorgänge bereitstellt.
Beispielcode:
Dokumente hier: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback
quelle
Hier ist der ES6-Code, mit dem ich ein Verzeichnis erstelle (wenn es nicht existiert):
Hinweis:
createDirectory
Funktion, ich den Weg zu garantieren normalisieren , dass der Pfad seperator Typ des Betriebssystems konsequent genutzt werden (zB dies wird sichC:\directory/test
inC:\directory\test
(unter Windows ist)fs.exists
ist veraltet , deshalbfs.stat
überprüfe ich , ob das Verzeichnis bereits existiertENOENT
( E rror NO ENT ry)fs.mkdir
fs.mkdir
gegenüber dem blockierenden Gegenstückfs.mkdirSync
und aufgrund des UmbruchsPromise
wird garantiert, dass der Pfad des Verzeichnisses erst zurückgegeben wird, nachdem das Verzeichnis erfolgreich erstellt wurdequelle
Meiner Meinung nach sollten Sie die Dateisystem-Treffer beim Codieren in Javascript besser nicht zählen. Wenn Sie jedoch (1)
stat
&mkdir
und (2)mkdir
den Fehlercode überprüfen (oder verwerfen), sind beide Möglichkeiten die richtigen, um das zu tun, was Sie wollen.quelle
quelle
All dies können Sie mit dem Dateisystemmodul tun.
Sie müssen wirklich nicht einmal überprüfen, ob das Verzeichnis vorhanden ist. Der folgende Code garantiert auch, dass das Verzeichnis entweder bereits vorhanden ist oder erstellt wurde.
quelle
Raugarals Antwort, aber mit -p-Funktionalität. Hässlich, aber es funktioniert:
quelle
Eine neuere Alternative zu Teemu Ikonens Antwort , die sehr einfach und leicht lesbar ist, ist die Verwendung der
ensureDir
Methode desfs-extra
Paketmethode.Es kann nicht nur als offensichtlicher Ersatz für das eingebaute
fs
Modul verwendet werden, sondern verfügt neben den Funktionen des Moduls auch über viele andere Funktionenfs
Pakets .Die
ensureDir
Methode stellt, wie der Name schon sagt, sicher, dass das Verzeichnis vorhanden ist. Wenn die Verzeichnisstruktur nicht vorhanden ist, wird sie erstellt. Mögenmkdir -p
. Nicht nur der Endordner, sondern der gesamte Pfad wird erstellt, falls noch nicht vorhanden.Die oben angegebene ist die
async
Version davon. Es gibt auch eine synchrone Methode, um dies in Form derensureDirSync
Methode durchzuführen .quelle
Die Antwort von @ Liberateur oben hat bei mir nicht funktioniert (Node v8.10.0). Kleine Modifikationen haben den Trick gemacht, aber ich bin mir nicht sicher, ob dies der richtige Weg ist. Bitte vorschlagen.
quelle