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 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.