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

Lesezeit: 6 Minuten

Benutzer-Avatar
du besser nicht

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 kenne mich mit Dateisystemen noch nicht aus.

ich habe gefunden Dies Methode, die Dateien und das Verzeichnis entfernt. Darin so etwas wie /path/to/directory/* wird nicht funktionieren.

Ich weiß nicht wirklich, welche Befehle verwendet werden sollten. Danke für die Hilfe.

  • Wenn Sie Platzhalter verwenden möchten, sehen Sie sich das an npmjs.org/package/glob.

    – Felix Klinge

    22. November 2014 um 1:03 Uhr

  • Schauen Sie einfach in der API nach, was ist so schwer daran? Sie müssen die Dateien in ein Verzeichnis holen und dann löschen.

    – Sikorsky

    22. November 2014 um 1:05 Uhr

  • Glob hat den Job gemacht, danke!

    – du besser nicht

    22. November 2014 um 1:14 Uhr

Benutzer-Avatar
Rodrigo5244

Um alle Dateien aus einem Verzeichnis zu entfernen, müssen Sie zuerst alle Dateien im Verzeichnis mit auflisten fs.readdirdann können Sie verwenden fs.unlink um jede Datei zu entfernen. Ebenfalls fs.readdir gibt nur die Dateinamen an, Sie müssen sie mit dem Verzeichnisnamen verketten, 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;
    });
  }
});

  • das funktioniert großartig, und die meisten werden bereits fs und path benötigen, also ist das ein Bonus, es werden keine zusätzlichen Pakete benötigt. Ich habe gerade ‘test’ gegen path.join (__dirname, ‘../../public/uploads’) ausgetauscht.

    – Russischer Sommer

    14. Dezember 2017 um 18:18 Uhr


  • Um 2p. hinzuzufügen, ist das Snippet großartig und nur eine Sache, die Sie beachten sollten, ist, dass es asynchron ist und in Skript-/Automatisierungsfällen möchten Sie vielleicht die synchrone Version davon verwenden, die fs.readdirSync. Einfach alle Dateien zuweisen: const files = fs.readdirSync(directory); und Schleife auf die gleiche Weise for (const file of files) {.

    – schwelgen

    19. Januar 2020 um 20:04 Uhr

  • So schließen Sie den Ordner aus “.git” in dem “Prüfung” Verzeichnis?

    – 5ervant – techintel.github.io

    22. Juni 2020 um 17:07 Uhr


  • Hinweis: Das rekursive Flag in fs.promises.rmdir ist veraltet und wird in Zukunft Fehler auslösen.

    – msg45f

    6. Januar 2021 um 15:55 Uhr

  • Die zweite vorgeschlagene Antwort entfernt das Verzeichnis, obwohl in der ursprünglichen Frage ausdrücklich darum gebeten wurde, das Verzeichnis beizubehalten.

    – Temporäre Behebung

    28. Mai 2021 um 16:40 Uhr

Benutzer-Avatar
Samiul Alam

Ja, es gibt ein Modul fs-extra. Es gibt eine Methode .emptyDir() innerhalb dieses Moduls, das die Arbeit erledigt. Hier ist ein Beispiel:

// NON-ES6 EXAMPLE
const fsExtra = require('fs-extra');
fsExtra.emptyDirSync(fileDir);

// ES6 EXAMPLE
import * as fsExtra from "fs-extra";
fsExtra.emptyDirSync(fileDir);

Es gibt auch eine asynchrone Version dieses Moduls. Jeder kann sich den Link ansehen.

  • Sehr nützliches Modul, Sie sollten es ausprobieren, es gibt viele Funktionen, die Sie sicher lieben werden.

    – gtrujillos

    20. August 2019 um 0:50 Uhr

  • Ja, warum etwas implementieren, das nicht trivial ist.

    – José Manuel Blasco

    31. März 2020 um 9:15 Uhr

  • Nur eine kleine Warnung, dieser Weg hat ein etwas anderes Verhalten als das gewünschte Verhalten der Frage, weil die emptyDir Funktion erstellt das Verzeichnis, wenn es nicht existiert.

    – Programmierer Raj

    9. Oktober 2020 um 23:03 Uhr

Benutzer-Avatar
Nicolas Guérinet

Es gibt ein Paket namens rimraf, das sehr praktisch ist. Es ist der UNIX-Befehl rm -rf für node.

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

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

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

  • IMO, was mit einer Funktion gelöst werden kann, sollte niemals mit einem Paket gelöst werden.

    – Aditya Anand

    17. Juni 2020 um 13:24 Uhr

  • @AdityaAnand – welche Funktion? Es ist unmöglich, ohne ein Paket zu importieren oder eine Menge Code selbst zu schreiben

    – vsync

    5. September 2020 um 12:01 Uhr

Es kann auch mit einem synchronen Einzeiler ohne Abhängigkeiten durchgeführt werden:

const { readdirSync, rmSync } = require('fs');
const dir="./dir/path";

readdirSync(dir).forEach(f => rmSync(`${dir}/${f}`));

Benutzer-Avatar
Jason Kim

Aufbauend auf der Antwort von @ Waterscroll, wenn Sie async 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();

  • Großartig! Genau das, wonach ich gesucht habe, da ich eine bestimmte Datei im Ordner behalten möchte: D

    – Silve2611

    10. Mai 2018 um 20:41 Uhr

  • Nur eine Anmerkung dazu return await Promise ist überflüssig. Du kannst einfach tun return Promise. Das toRun Die Funktion ist asynchron. Wenn also ein Versprechen zurückgegeben wird, kann die App darauf warten.

    – ItalyPaleAle

    3. Februar 2019 um 8:07 Uhr

  • Sie können jetzt verwenden const { promises: fs } = require('fs'); ab Knoten 10+ glaube ich.

    – Schikyo

    10. November 2019 um 8:34 Uhr

Benutzer-Avatar
Rudy Hünh

Wie wäre es, wenn Sie eine Befehlszeile ausführen:

require('child_process').execSync('rm -rf /path/to/directory/*')

  • Großartig! Genau das, wonach ich gesucht habe, da ich eine bestimmte Datei im Ordner behalten möchte: D

    – Silve2611

    10. Mai 2018 um 20:41 Uhr

  • Nur eine Anmerkung dazu return await Promise ist überflüssig. Du kannst einfach tun return Promise. Das toRun Die Funktion ist asynchron. Wenn also ein Versprechen zurückgegeben wird, kann die App darauf warten.

    – ItalyPaleAle

    3. Februar 2019 um 8:07 Uhr

  • Sie können jetzt verwenden const { promises: fs } = require('fs'); ab Knoten 10+ glaube ich.

    – Schikyo

    10. November 2019 um 8:34 Uhr

Short Vanilla Node 10-Lösung

import fs from 'fs/promises'

await fs.readdir('folder').then((f) => Promise.all(f.map(e => fs.unlink(e))))

  • Willst du nicht darauf warten? await Promise.all(files.map(file => fs.promises.unlink(path.join(directory, file))))

    – c24w

    17. September 2021 um 12:24 Uhr

  • @ c24w Behoben. Vielen Dank

    – Andreas Tzionis

    17. September 2021 um 21:24 Uhr

  • Ich denke, das ist wie der heilige Gral, nach dem ich gesucht habe. Vorausgesetzt, folgendes funktioniert auch: fs.promises.readdir('path-to-folder').then((f) => Promise.all(f.map(e => fs.promises.unlink(e)))) .then(()=>{console.log("all deleted")})

    – Alexander D’Attore

    19. September 2021 um 8:22 Uhr

  • @AndreasTzionis jeder für sich, aber ich denke, die gemischten Versprechungsmuster machen dies im Vergleich zu rein verwirrend async/await: const files = await fs.promises.readdir('path-to-folder'); und await Promise.all(files.map(f => fs.promises.unlink(f))). Außerdem scheinst du das auch verloren zu haben path.join aus der ursprünglichen Antwort – nicht sicher, ob das beabsichtigt war. Bonus: Sie können verwenden 'fs/promises' um zu vermeiden, setzen zu müssen .promises bei jeder Operation.

    – c24w

    20. September 2021 um 11:13 Uhr

1283260cookie-checkSo entfernen Sie alle Dateien aus dem Verzeichnis, ohne das Verzeichnis in Node.js zu entfernen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy