So entfernen Sie alle Dateien aus dem Verzeichnis, ohne das Verzeichnis in Node.js zu entfernen

92

Wie entferne ich alle Dateien aus einem Verzeichnis, ohne ein Verzeichnis selbst mit Node.js zu entfernen?
Ich möchte temporäre Dateien entfernen. Ich bin noch nicht gut mit Dateisystemen.

Ich habe diese Methode gefunden, die Dateien und das Verzeichnis entfernt. Darin /path/to/directory/*funktioniert so etwas nicht.

Ich weiß nicht genau, welche Befehle ich verwenden soll. Danke für die Hilfe.

du besser nicht
quelle
2
Wenn Sie Platzhalter verwenden möchten, besuchen Sie npmjs.org/package/glob .
Felix Kling
1
schau einfach nach der API, was ist so schwer daran? Sie müssen die Dateien in einem Verzeichnis abrufen und dann löschen.
Sikorski
2
Glob hat den Job gemacht, danke!
betternot

Antworten:

151

Um alle Dateien aus einem Verzeichnis zu entfernen, müssen Sie zuerst alle Dateien im Verzeichnis mit auflisten fs.readdirund dann fs.unlinkjede Datei entfernen. Außerdem fs.readdirwerden nur die Dateinamen angegeben. Sie müssen sich mit dem Verzeichnisnamen abfinden, um den vollständigen Pfad zu erhalten.

Hier ist ein Beispiel

const fs = require('fs');
const path = require('path');

const directory = 'test';

fs.readdir(directory, (err, files) => {
  if (err) throw err;

  for (const file of files) {
    fs.unlink(path.join(directory, file), err => {
      if (err) throw err;
    });
  }
});
Rodrigo5244
quelle
4
Dies funktioniert großartig und die meisten haben bereits Fs und Pfad erforderlich, so dass dies ein Bonus ist und keine zusätzlichen Pakete erforderlich sind. Ich tauschte gerade aus 'Test' für path.join (__ dirname‘../../public/uploads')
russiansummer
2
Um 2p hinzuzufügen, ist das Snippet großartig und nur eines ist zu beachten: Es ist asynchron und in Skripterstellungs- / Automatisierungsfällen möchten Sie möglicherweise eine synchrone Version davon verwenden, das fs.readdirSync. Weisen Sie einfach alle Dateien zu: const files = fs.readdirSync(directory);und wiederholen Sie die Schleife auf dieselbe Weise for (const file of files) {.
am
Wie schließe ich den Ordner ".git" im Verzeichnis "test" aus ?
5ervant
Sie können der for-Schleife eine if-Anweisung hinzufügen, um diesen Fall zu entfernen. Wenn Sie jedoch Dateien und Ordner rekursiv entfernen möchten, möchten Sie möglicherweise ein npm-Paket verwenden. npmjs.com/package/fs-extra
Rodrigo5244
37

Ja, es gibt ein Modul fs-extra . .emptyDir()In diesem Modul gibt es eine Methode, die den Job erledigt. Hier ist ein Beispiel:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Es gibt auch eine asynchrone Version dieses Moduls. Jeder kann den Link überprüfen.

Samiul Alam
quelle
2
Sehr nützliches Modul, Sie sollten es ausprobieren, es gibt viele Funktionen, die Sie sicher lieben werden.
Tegua
Ja, warum etwas implementieren, das nicht trivial ist?
manuman94
32

Es gibt ein Paket namens Rimraf, das sehr praktisch ist. Dies ist der UNIX-Befehl rm -rf für den Knoten.

Trotzdem kann es auch zu leistungsfähig sein, da Sie damit sehr einfach Ordner löschen können. Mit den folgenden Befehlen werden die Dateien im Ordner gelöscht. Wenn Sie das * entfernen, entfernen Sie den Protokollordner.

const rimraf = require('rimraf');
rimraf('./log/*', function () { console.log('done'); });

https://www.npmjs.com/package/rimraf

Nicolas Guérinet
quelle
IMO, was mit einer Funktion gelöst werden kann, sollte niemals mit einem Paket gelöst werden.
Aditya Anand
12

Aufbauend auf der Antwort von @ Waterscroll, wenn Sie asynchron verwenden und in Knoten 8+ warten möchten:

const fs = require('fs');
const util = require('util');
const readdir = util.promisify(fs.readdir);
const unlink = util.promisify(fs.unlink);
const directory = 'test';

async function toRun() {
  try {
    const files = await readdir(directory);
    const unlinkPromises = files.map(filename => unlink(`${directory}/${filename}`));
    return Promise.all(unlinkPromises);
  } catch(err) {
    console.log(err);
  }
}

toRun();
Jason Kim
quelle
1
großartig! Genau das, wonach ich gesucht habe, da ich eine bestimmte Datei im Ordner behalten möchte: D
Silve2611
1
Nur eine return await Promiseüberflüssige Notiz . Du kannst es einfach tun return Promise. Die toRunFunktion ist asynchron. Wenn also ein Versprechen zurückgegeben wird, kann die App darauf warten.
ItalyPaleAle
Sie können jetzt const { promises: fs } = require('fs');von Knoten 10+ verwenden, glaube ich.
Shikyo
0

🚀 graph-fs


Installieren

npm i graph-fs

Verwenden

const {Node} = require("graph-fs");
const directory = new Node("/path/to/directory");

directory.clear(); // <--
Yairopro
quelle