Как удалить все файлы из каталога без удаления каталога в 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!'));

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(); // <--
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.