Как удалить все файлы из каталога без удаления каталога в Node.js

101

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

Я нашел этот метод, который удалит файлы и каталог. В этом что-то вроде /path/to/directory/*не сработает.

Я действительно не знаю, какие команды следует использовать. Спасибо за помощь.

ты лучше
источник
2
Если вы хотите использовать подстановочные знаки, посетите npmjs.org/package/glob .
Felix Kling
1
просто посмотрите api, что в нем такого сложного? вам нужно получить файлы в каталоге, а затем удалить их.
Sikorski
2
Glob сделал свою работу, спасибо!
youbetternot

Ответы:

161

Чтобы удалить все файлы из каталога, сначала вам нужно перечислить все файлы в каталоге с помощью 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!'));
Родриго5244
источник
4
это отлично работает, и у большинства уже есть требуемые fs и path, так что это бонус, никаких дополнительных пакетов не требуется. я просто выгружен 'тест' для path.join (__ «, имя папки ../../public/uploads')
russiansummer
3
чтобы добавить 2p., фрагмент великолепен, и нужно помнить только об одном: он асинхронный, и в случаях сценариев / автоматизации вы можете захотеть использовать его синхронную версию fs.readdirSync. Просто назначьте все файлы: const files = fs.readdirSync(directory);и выполните цикл таким же образом for (const file of files) {.
веселиться
Как исключить папку «.git» из «тестовой» директории?
5ervant
Вы можете добавить оператор if в цикл for, чтобы удалить этот случай, но если вы хотите рекурсивно удалять файлы и папки, вы можете использовать какой-нибудь пакет npm. npmjs.com/package/fs-extra
Rodrigo5244
45

Да, есть модуль fs-extra . .emptyDir()Внутри этого модуля есть метод, который выполняет эту работу. Вот пример:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

Также существует асинхронная версия этого модуля. Любой желающий может проверить ссылку.

Самиул Алам
источник
3
Очень полезный модуль, вам стоит его попробовать, есть много функций, которые вам точно понравятся.
gts
1
Да зачем реализовывать то, что нетривиально.
manuman94
1
Небольшое предупреждение, этот способ имеет немного другое поведение, чем желаемое поведение вопроса, потому что emptyDirфункция создает каталог, если он не существует.
программист
35

Есть очень удобный пакет под названием римраф. Это команда UNIX rm -rf для узла.

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

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

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

Николя Герине
источник
ИМО, то, что можно решить с помощью функции, никогда не должно решаться с помощью пакета.
Адитья Ананд,
1
@AdityaAnand - какая функция? это невозможно без импорта какого-либо пакета или написания тонны кода самостоятельно
vsync
12

Основываясь на ответе @ Waterscroll, если вы хотите использовать async и ждать в узле 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Функция асинхронная, поэтому , когда обещание возвращается, приложение может ждать на этом.
ItalyPaleAle
const { promises: fs } = require('fs');Я считаю, что теперь вы можете использовать с узла 10+.
Shikyo
0

🚀 граф-фс


Установить

npm i graph-fs

Использовать

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

directory.clear(); // <--
Яиропро
источник