Як видалити всі файли з каталогу, не видаляючи каталог у 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.