In meiner Node-Anwendung muss ich ein Verzeichnis entfernen, das einige Dateien enthält, aber fs.rmdir
funktioniert nur bei leeren Verzeichnissen. Wie kann ich das machen?
Antworten
Zu viele Anzeigen?Ultraschnell und fehlerfrei
Sie können das lignator
-Paket (https://www.npmjs.com/package/lignator) verwenden, es ist schneller als jeder asynchrone Code (z.B. rimraf) und ausfallsicherer (besonders unter Windows, wo die Dateientfernung nicht sofort erfolgt und Dateien möglicherweise von anderen Prozessen gesperrt sind).
4,36 GB an Daten, 28.042 Dateien, 4.217 Ordner auf Windows in 15 Sekunden entfernt im Vergleich zu rimraf's 60 Sekunden auf einer alten Festplatte.
const lignator = require('lignator');
lignator.remove('./build/');
2020 Antwort
Wenn Sie dies in einem npm-Skript tun möchten, müssen Sie kein Drittprogramm installieren, wenn Sie den Befehl npx
verwenden
Wenn Sie beispielsweise die Ordner dist und .cache löschen möchten, wenn Sie npm run clean
ausführen, fügen Sie einfach diesen Befehl zu Ihrer package.json hinzu
{
"scripts": {
"clean": "npx rimraf dist .cache"
}
}
Es funktioniert in jedem Betriebssystem
Ordner entfernen mit den Dateien oder nur einer Datei.
Ich bin nicht sehr großzügig oder hilfreich, aber ich konnte keine gute Lösung für dieses Problem finden und musste meinen eigenen Weg finden... also hoffe ich, dass es Ihnen gefällt :)
Funktioniert perfekt für mich mit jeder Anzahl von verschachtelten Verzeichnissen und Unterverzeichnissen. Achten Sie auf den Bereich von 'this' beim rekursiven Aufruf der Funktion, Ihre Implementierung könnte anders sein. In meinem Fall bleibt diese Funktion im Rückgabewert einer anderen Funktion, deshalb rufe ich sie mit 'this' auf.
const fs = require('fs');
deleteFileOrDir(path, pathTemp = false){
if (fs.existsSync(path)) {
if (fs.lstatSync(path).isDirectory()) {
var files = fs.readdirSync(path);
if (!files.length) return fs.rmdirSync(path);
for (var file in files) {
var currentPath = path + "/" + files[file];
if (!fs.existsSync(currentPath)) continue;
if (fs.lstatSync(currentPath).isFile()) {
fs.unlinkSync(currentPath);
continue;
}
if (fs.lstatSync(currentPath).isDirectory() && !fs.readdirSync(currentPath).length) {
fs.rmdirSync(currentPath);
} else {
this.deleteFileOrDir(currentPath, path);
}
}
this.deleteFileOrDir(path);
} else {
fs.unlinkSync(path);
}
}
if (pathTemp) this.deleteFileOrDir(pathTemp);
}
const fs = require("fs")
const path = require("path")
let _dirloc = ''
if (fs.existsSync(_dirloc)) {
fs.readdir(path, (err, files) => {
if (!err) {
for (let file of files) {
// Lösche jede Datei
fs.unlinkSync(path.join(_dirloc, file))
}
}
})
// Nach dem 'done' jeder Dateilöschung,
// Lösche das Verzeichnis selbst.
if (fs.unlinkSync(_dirloc)) {
console.log('Directory has been deleted!')
}
}