In meiner Knotenanwendung muss ich ein Verzeichnis entfernen, das einige Dateien enthält, aber fs.rmdir
nur in leeren Verzeichnissen funktioniert. Wie kann ich das machen?
node.js
filesystems
Sachin
quelle
quelle
fs.readdir(dirPath)
Durchlaufen Sie für ein Array von Pfaden in einem Ordner diefs.unlink(filename)
einzelnen Dateien und anschließendfs.rmdir(dirPath)
den jetzt leeren Ordner. Wenn Sie rekursiv arbeiten müssen, überprüfen Siefs.lstat(filename).isDirectory()
.Antworten:
Hierfür gibt es ein Modul namens
rimraf
( https://npmjs.org/package/rimraf ). Es bietet die gleiche Funktionalität wierm -Rf
Asynchrone Verwendung:
Synchronisierungsnutzung :
quelle
deleteFolderRecursive
in der folgenden Antwort schreiben ?recursive
Option verwenden: stackoverflow.com/a/57866165/6269864Ordner synchron entfernen
quelle
var curPath = path + "/" + file;
mitvar curPath = p.join(path, file);
bereitgestellten enthalten Sie den Pfad - Modul:var p = require("path")
path.join(dirpath, file)
sollte also besser sein alspath + "/" + file
Die meisten
fs
Benutzer von Node.js möchten Funktionen, die der "Unix-Methode" für den Umgang mit Dateien nahe kommen. Ich benutze fs-extra , um all die coolen Sachen zu bringen:Noch besser ist, dass fs-extra ein Ersatz für native fs ist. Alle Methoden in fs sind unverändert und damit verbunden. Dies bedeutet, dass Sie fs durch fs-extra ersetzen können :
Und dann können Sie einen Ordner folgendermaßen entfernen:
quelle
removeSync('/tmp/myFolder')
Ab 2019 ...
Ab Node.js 12.10.0 ,
fs.rmdirSync
unterstützt einerecursive
Auswahl, so dass Sie schließlich tun können:Wobei die
recursive
Option das gesamte Verzeichnis rekursiv löscht.quelle
recursive: true
und löscht nicht leere Ordner ohne Beanstandung.fs.rmdir(path[, options], callback)
oderfs.rmdirSync(path[, options])
fs.rmdir
experimentell mit Stabilität 1 gearbeitet wird. "Stabilität: 1 - experimentell. Die Funktion unterliegt nicht den Regeln für die semantische Versionierung. In keinem Fall können nicht abwärtskompatible Änderungen oder Entfernungen auftreten zukünftige Version. Die Verwendung der Funktion wird in Produktionsumgebungen nicht empfohlen. "Meine geänderte Antwort von @oconnecp ( https://stackoverflow.com/a/25069828/3027390 )
Verwendet path.join für eine bessere plattformübergreifende Erfahrung. Vergessen Sie also nicht, es zu verlangen.
Auch umbenannte Funktion in
rimraf
;)quelle
Normalerweise belebe ich alte Fäden nicht wieder, aber hier gibt es eine Menge Abwanderung und ohne Rimraf-Antwort. Diese scheinen mir alle zu kompliziert.
Erstens können Sie im modernen Knoten (> = v8.0.0) den Prozess vereinfachen, indem Sie nur vollständig asynchrone Knotenkernmodule verwenden und gleichzeitig die Verknüpfung von Dateien in einer Funktion von fünf Zeilen parallelisieren und trotzdem die Lesbarkeit beibehalten:
In einem anderen Punkt ist ein Schutz für Pfadüberquerungsangriffe für diese Funktion ungeeignet, weil
rm -rf
, als es ein Argument akzeptiert und es dem Benutzer ermöglicht,rm -rf /
wenn er dazu aufgefordert wird. Es liegt in der Verantwortung eines Skripts, nicht dasrm
Programm selbst zu schützen ..isDirectory()
istfalse
für sym-Links und UNLINKED nicht rekursiv.Last but not least gibt es eine seltene Race-Bedingung, dass die Rekursion fehlerhaft sein kann, wenn einer der Einträge nicht verknüpft oder gelöscht wurde außerhalb dieses Skripts zum richtigen Zeitpunkt während der Ausführung dieser Rekursion nicht . Da dieses Szenario in den meisten Umgebungen nicht typisch ist, kann es wahrscheinlich übersehen werden. Bei Bedarf (für einige Randfälle) kann dieses Problem jedoch durch dieses etwas komplexere Beispiel behoben werden:
BEARBEITEN: Machen Sie
isDirectory()
eine Funktion. Entfernen Sie das eigentliche Verzeichnis am Ende. Fehlende Rekursion behoben.quelle
await
Ihren nicht anPromise.all(…)
; ist das beabsichtigt? Es scheint, alsresults.forEach
würde der aktuelle Status Versprechungen durchlaufen, während der Code erwartet, dass er die Ergebnisse durchläuft. Vermisse ich etwasif (!fs.existsSync(dir)) return
readdir
wird einen Fehler auslösen, wie es sollte. Wenn Siermdir non-existing-dir
den Exit-Code ist ein Fehler. Es liegt in der Verantwortung des Verbrauchers, es zu versuchen / zu fangen. Dies ist die gleiche Methode, die in den Node-Dokumenten beschrieben wird, wenn es um die Verwendung von fs-Funktionen geht. Sie erwarten, dass Sie versuchen / fangen und sich die Fehler ansehen,code
um festzustellen, was zu tun ist. Ein zusätzlicher Check führt eine Rennbedingung ein.fs.exists
verwendet wird. PS das ist eine großartige Lösung.Hier ist eine asynchrone Version der Antwort von @ SharpCoder
quelle
Ich habe diese Funktion namens Ordner entfernen geschrieben. Es werden rekursiv alle Dateien und Ordner an einem Speicherort entfernt. Das einzige Paket, das benötigt wird, ist asynchron.
quelle
Wenn Sie Knoten 8+ verwenden, möchten Sie Asynchronität und keine externen Abhängigkeiten. Hier ist die asynchrone / wartende Version:
quelle
Asynchrone Version der Antwort von @ SharpCoder mit fs.promises:
quelle
Ich erreichte hier, während ich versuchte, mit dem fertig zu werden,
gulp
und schreibe für weitere Reichweiten.gulp-clean
veraltet fürgulp-rimraf
gulp-rimraf
veraltet zugunsten vondelete-files-folders
Wenn Sie Dateien und Ordner mit löschen möchten
del
, sollten Sie sie/**
zum rekursiven Löschen anhängen .quelle
Das De-facto-Paket ist
rimraf
, aber hier ist meine winzige asynchrone Version:quelle
In der neuesten Version von Node.js (12.10.0 oder höher), die
rmdir
Stil - Funktionenfs.rmdir()
,fs.rmdirSync()
undfs.promises.rmdir()
haben eine neue experimentelle Option ,recursive
die nicht-leere Verzeichnisse ermöglicht das Löschen, zBDie zugehörige PR auf GitHub: https://github.com/nodejs/node/pull/29168
quelle
Laut
fs
Dokumentation bietetfsPromises
derzeit dierecursive
Option auf experimenteller Basis, die, zumindest in meinem Fall unter Windows, das Verzeichnis und alle darin enthaltenen Dateien entfernt.Entfernt
recursive: true
die Dateien unter Linux und MacOS?quelle
Ultra-Geschwindigkeit und ausfallsicher
Sie können das
lignator
Paket verwenden ( https://www.npmjs.com/package/lignator ), es ist schneller als jeder asynchrone Code (z. B. rimraf) und ausfallsicherer (insbesondere in Windows, wo das Entfernen von Dateien nicht sofort erfolgt und Dateien möglicherweise nicht vorhanden sind durch andere Prozesse gesperrt sein).quelle
Ordner mit den Dateien oder nur einer Datei entfernen.
Ich bin weder ein Geber noch ein Mitwirkender, aber ich konnte keine gute Lösung für dieses Problem finden und musste mich zurechtfinden ... also hoffe ich, dass es Ihnen gefällt :)
Funktioniert perfekt für mich mit einer beliebigen Anzahl von verschachtelte Verzeichnisse und Unterverzeichnisse. Achtung für den Umfang von 'this' bei der Rekursion der Funktion kann Ihre Implementierung anders sein. In meinem Fall bleibt diese Funktion in der Rückgabe einer anderen Funktion, deshalb rufe ich sie damit auf.
quelle
Während
recursive
ist eine experimentelle Option vonfs.rmdir
quelle
2020 Update
Ab Version 12.10.0 recursiveOption für Optionen hinzugefügt.
Beachten Sie, dass das rekursive Löschen experimentell ist .
Sie würden also für die Synchronisierung Folgendes tun:
oder für Async:
quelle
Verwenden Sie einfach das rmdir-Modul ! es ist leicht und einfach.
quelle
Eine andere Alternative ist die Verwendung des
fs-promise
Moduls, das vielversprechende Versionen des bereitstelltfs-extra
ModuleSie könnten dann wie folgt schreiben:
Hinweis: Für async / await ist eine aktuelle Version von nodejs (7.6+) erforderlich.
quelle
Ein schneller und schmutziger Weg (möglicherweise zum Testen) könnte darin bestehen, die Methode
exec
oder direktspawn
zum Aufrufen des Betriebssystemaufrufs zum Entfernen des Verzeichnisses zu verwenden. Lesen Sie mehr über NodeJs child_process .Nachteile sind:
Leistungen:
quelle
-f
Flag entfernen , um die Sicherheit zu gewährleisten, oder während der Eingabe sicherstellen, dass nicht alles gelöscht wird.exec + rm
ist ein gültiger und nützlicher Befehl im Knoten, den ich beim Testen häufig verwende.Ich wünschte, es gäbe eine Möglichkeit, dies ohne zusätzliche Module für etwas so Winziges und Gemeinsames zu tun, aber dies ist das Beste, was ich mir einfallen lassen könnte.
Update: Sollte jetzt unter Windows (getestet Windows 10) und auch unter Linux / Unix / BSD / Mac-Systemen funktionieren.
quelle
child_process.execFile
das die Shell nicht aufruft, und übergeben Sie stattdessen explizit Argumente.Dies ist ein Ansatz, bei dem promisify und zwei Hilfefunktionen (to und toAll) verwendet werden, um das Versprechen zu lösen.
Es führt alle Aktionen asynchron aus.
quelle
// ohne Verwendung einer Drittanbieter-Bibliothek
quelle
fs.unllinkSync(path.join(FOLDER_PATH, element);
quelle