Jak usunąć wszystkie pliki z katalogu bez usuwania katalogu w Node.js.


106

Jak usunąć wszystkie pliki z katalogu bez usuwania samego katalogu za pomocą Node.js?
Chcę usunąć pliki tymczasowe. Nie jestem jeszcze dobry z systemami plików.

Znalazłem tę metodę, która usunie pliki i katalog. W tym coś takiego jak /path/to/directory/*nie zadziała.

Naprawdę nie wiem, jakich poleceń należy używać. Dzięki za pomoc.


2
Jeśli chcesz używać symboli wieloznacznych, sprawdź npmjs.org/package/glob .
— Felix Kling

1
po prostu spójrz na interfejs API, co jest w tym takiego trudnego? musisz pobrać pliki w katalogu, a następnie je usunąć.
— Sikorski

2
Glob wykonał robotę, dziękuję!
— youbetternot

Odpowiedzi:


169

Aby usunąć wszystkie pliki z katalogu, najpierw musisz wyświetlić listę wszystkich plików w katalogu za pomocą fs.readdir, a następnie możesz użyć fs.unlinkdo usunięcia każdego pliku. Poda również fs.readdirtylko nazwy plików, które musisz połączyć z nazwą katalogu, aby uzyskać pełną ścieżkę.

Oto przykład

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;
    });
  }
});

Zaktualizuj wersję węzła 14

Istnieje recursiveflaga, której możesz użyć w programie, rmdiraby usunąć wszystkie pliki rekurencyjnie. Aby uzyskać więcej informacji, zobacz dokumentację nodejs .

const fs = require('fs').promises;

const directory = 'test';

fs.rmdir(directory, { recursive: true })
  .then(() => console.log('directory removed!'));

4
to działa świetnie, a większość z nich będzie już potrzebować FS i ścieżki, więc jest to bonus, nie są potrzebne żadne dodatkowe pakiety. właśnie zamieniłem 'test' na path.join (__ dirname, '../../public/uploads')
— russiansummer

3
aby dodać 2p., fragment kodu jest świetny i należy pamiętać tylko o tym, że jest on asynchroniczny, aw przypadku skryptów / automatyzacji możesz chcieć użyć jego synchronicznej wersji fs.readdirSync. Po prostu przypisz wszystkie pliki: const files = fs.readdirSync(directory);i zapętl w ten sam sposób for (const file of files) {.
— odkrył

Jak wykluczyć folder „.git” w katalogu „test” ?
— 5sługa

Możesz dodać instrukcję if w pętli for, aby usunąć ten przypadek, ale jeśli chcesz rekurencyjnie usuwać pliki i foldery, możesz użyć pakietu npm. npmjs.com/package/fs-extra
— Rodrigo5244

Uwaga: Flaga rekurencyjna w fs.promises.rmdir jest przestarzała i będzie powodować błędy w przyszłości.
— msg45f

49

Tak, istnieje moduł fs-extra . W .emptyDir()tym module znajduje się metoda , która wykonuje to zadanie. Oto przykład:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Istnieje również asynchroniczna wersja tego modułu. Każdy może sprawdzić link.


3
Bardzo przydatny moduł, warto go wypróbować, jest mnóstwo funkcji, które na pewno pokochasz.
— gts

1
Tak, po co wdrażać coś, co nie jest trywialne.
— manuman94

2
Tylko małe ostrzeżenie, w ten sposób zachowuje się nieco inaczej niż oczekiwane zachowanie w pytaniu, ponieważ emptyDirfunkcja tworzy katalog, jeśli nie istnieje.
— programmerRaj

36

Jest pakiet zwany rimraf, który jest bardzo poręczny. Jest to polecenie UNIX rm -rf dla węzła.

Niemniej jednak może być zbyt potężny, ponieważ możesz bardzo łatwo usuwać foldery za jego pomocą. Poniższe polecenia usuwają pliki w folderze. Jeśli usuniesz *, usuniesz folder dziennika.

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

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


IMO, co można rozwiązać za pomocą funkcji, nigdy nie powinno być rozwiązywane za pomocą pakietu.
— Aditya Anand

1
@AdityaAnand - jaka funkcja? jest to niemożliwe bez zaimportowania jakiegoś pakietu lub samodzielnego
— napisania mnóstwa

12

Opierając się na odpowiedzi @ Waterscroll, jeśli chcesz używać async i czekać w węźle 8+:

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();

1
świetny! Właśnie tego szukałem, ponieważ chcę zachować określony plik w folderze: D
— Silve2611

1
Tylko uwaga, która return await Promisejest zbędna. Możesz po prostu to zrobić return Promise. toRunFunkcja jest asynchroniczny, więc gdy zwracana jest obietnica, aplikacja może czekać na to.
— PaleAle

Myślę, że możesz teraz korzystać const { promises: fs } = require('fs');z węzła 10+.
— Shikyo,

0

🚀 wykres-fs


zainstalować

npm i graph-fs

Posługiwać się

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

directory.clear(); // <--
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.