Як видалити всі файли з каталогу, не видаляючи каталог у Node.js


102

Як видалити всі файли з каталогу, не видаляючи саму директорію за допомогою Node.js?
Я хочу видалити тимчасові файли. Я ще нічого не знаю з файловими системами.

Я знайшов цей метод, який видалить файли та каталог. У цьому щось на зразок /path/to/directory/*не спрацює.

Я насправді не знаю, які команди слід використовувати. Дякую за допомогу.


2
Якщо ви хочете використовувати символи підстановки, перевірте npmjs.org/package/glob .
Фелікс Клінг

1
просто шукайте api, що там такого важкого? вам потрібно отримати файли в каталозі, а потім видалити їх.
Сікорський

2
Глоб зробив роботу, дякую!
youbetternot

Відповіді:


162

Щоб видалити всі файли з каталогу, спочатку потрібно перерахувати всі файли в каталозі за допомогою fs.readdir, а потім можна використовувати fs.unlinkдля видалення кожного файлу. Також fs.readdirдадуть лише імена файлів, вам потрібно зв'язатись з ім'ям каталогу, щоб отримати повний шлях.

Ось приклад

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

Версія вузла оновлення 14

Існує recursiveпрапор, за допомогою якого ви можете rmdirрекурсивно видаляти всі файли. Докладнішу інформацію див. У документації nodejs .

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

const directory = 'test';

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

4
це чудово працює, і для більшості вже потрібні fs та шлях, тому це бонус, не потрібні додаткові пакети. я просто вивантажено 'тест' для path.join (__ «, ім'я папки ../../public/uploads ')
russiansummer

3
додати 2р., сниппет великий , і тільки одна річ , щоб мати на увазі, що це асинхронна і в сценарії / випадки автоматизації ви можете захотіти використовувати синхронну версію цього, fs.readdirSync. Просто призначте всі файли: const files = fs.readdirSync(directory);і цикл однаково for (const file of files) {.
веселощі

Як виключити папку ".git" у каталозі "test" ?
5ervant

Ви можете додати оператор if у циклі for, щоб видалити цей випадок, але якщо ви хочете рекурсивно видалити файли та папки, ви можете використати якийсь пакет npm. npmjs.com/package/fs-extra
Rodrigo5244

46

Так, є модуль fs-extra . .emptyDir()Усередині цього модуля є метод, який виконує цю роботу. Ось приклад:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Існує також асинхронна версія цього модуля. Будь-хто може перевірити посилання.


3
Дуже корисний модуль, ви повинні спробувати його, є безліч функцій, які вам точно сподобаються.
gts

1
Так, навіщо реалізовувати щось нетривіальне.
manuman94

1
Тільки невелике попередження, таким чином поведінка дещо відрізняється від бажаної поведінки запитання, оскільки emptyDirфункція створює каталог, якщо він не існує.
програміст

35

Існує пакет під назвою rimraf, який дуже зручний. Це команда UNIX rm -rf для вузла.

Тим не менш, він може бути занадто потужним, тому що ви можете дуже легко видалити папки, використовуючи його. Наступні команди видалять файли всередині папки. Якщо ви видалите *, ви видалите папку журналу.

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

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


IMO, що можна вирішити за допомогою функції, ніколи не слід вирішувати за допомогою пакета.
Адітя Ананд

1
@AdityaAnand - яка функція? це неможливо без імпорту деяких пакунків або написання тонни коду самостійно
vsync

12

Спираючись на відповідь @ Waterscroll, якщо ви хочете використовувати асинхронізацію та чекати у вузлі 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
чудово! Тільки те, що я шукав, оскільки хочу залишити певний файл у папці: D
Silve2611

1
Просто примітка, яка return await Promiseє зайвою. Ви можете просто зробити return Promise. toRunФункція асинхронна, тому , коли обіцянку повертається, додаток може чекати на цьому.
ItalyPale,

Тепер ви можете використовувати const { promises: fs } = require('fs');з вузла 10+, я вважаю.
Шикьо

0

🚀 графік- ф


Встановити

npm i graph-fs

Використовуйте

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

directory.clear(); // <--
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.