Pesquisa de site

javascript - Como remover todos os arquivos de um diretório sem remover o diretório no Node.js


Como remover todos os arquivos de um diretório sem remover o próprio diretório usando Node.js?
Eu quero remover arquivos temporários. Ainda não sou muito bom com sistemas de arquivos.

Eu encontrei este método, que removerá arquivos e o diretório. Nele, algo como /path/to/directory/* não funcionará.

Eu realmente não sei quais comandos devo usar. Obrigado pela ajuda.

Resposta #1

Para remover todos os arquivos de um diretório, primeiro você precisa listar todos os arquivos no diretório usando fs.readdir, depois você pode usar fs.unlink para remover cada arquivo. Além disso, fs.readdir vai fornecer apenas os nomes dos arquivos, você precisa concatenar com o nome do diretório para obter o caminho completo. Se sua pasta tiver outras pastas dentro, você precisará verificar isso e usar fs.rmdir em vez disso.

Aqui está um exemplo

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

Usando promessas

import fs from "node:fs/promises";
import path from "node:path";

const directory = "test";

for (const file of await fs.readdir(directory)) {
  await fs.unlink(path.join(directory, file));
}

Resposta #2

Sim, existe um módulo fs-extra. Há um método .emptyDir() dentro deste módulo que realiza a tarefa. Aqui está um exemplo:

// NON-ES6 EXAMPLE
const fsExtra = require('fs-extra');
fsExtra.emptyDirSync(fileDir);

// ES6 EXAMPLE
import * as fsExtra from "fs-extra";
fsExtra.emptyDirSync(fileDir);

Existe também uma versão assíncrona deste módulo. Qualquer pessoa pode conferir o link.

Resposta #3

Também pode ser feito com uma linha única síncrona sem dependências:

const { readdirSync, rmSync } = require('fs');
const dir = './dir/path';

readdirSync(dir).forEach(f => rmSync(`${dir}/${f}`));

Resposta #4

Existe um pacote chamado rimraf que é muito útil. É o comando UNIX rm -rf para o node.

No entanto, ele também pode ser muito poderoso porque você pode deletar pastas muito facilmente usando-o. Os seguintes comandos irão deletar os arquivos dentro da pasta. Se você remover o *, você removerá a pasta de logs.

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

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

Resposta #5

Com base na resposta de @Waterscroll, se você quiser usar async e await no node 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();

Artigos relacionados