如何在不删除Node.js中的目录的情况下从目录中删除所有文件

you*_*not 58 javascript node.js

如何在不使用Node.js删除目录的情况下从目录中删除所有文件?
我想删除临时文件.我对文件系统没有任何好处.

我找到了这个方法,它将删除文件和目录.在那,类似的东西/path/to/directory/*将无法奏效.

我真的不知道应该使用什么命令.谢谢您的帮助.

Wat*_*oll 111

要从目录中删除所有文件,首先需要列出目录中的所有文件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;
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,大多数都已经需要fs和path了,所以这是一个额外的奖励,不需要额外的程序包。我只是换了'test'为path.join(__ dirname,'../../public/uploads') (3认同)
  • 添加 2p.,该片段很棒,只需记住一件事是它是异步的,在脚本/自动化情况下,您可能需要使用它的同步版本,“fs.readdirSync”。只需分配所有文件:`const files = fs.readdirSync(directory);`并以相同的方式循环`for (const file of files) {`。 (3认同)
  • 注意:fs.promises.rmdir 中的递归标志已被弃用,并且将来会抛出错误。 (2认同)

Jef*_*D23 53

It can also be done with a synchronous one-liner without dependencies:

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

readdirSync(dir).forEach(f => rmSync(`${dir}/${f}`));
Run Code Online (Sandbox Code Playgroud)

  • @Lucke 将 `{recursive: true}` 作为第二个参数传递给 `rmSync`。 (5认同)
  • 如果该目录还包含文件夹怎么办? (2认同)
  • 这是一篇很好的单行诗,谢谢。对我来说,当我尝试清除文件的文件夹中遇到目录时,它失败了。以下是我想出的修复方法: `readdirSync(dir, { withFileTypes: true }).forEach(f => { if (f.isFile()) rmSync(path.join(dir, f.name)) } );` (2认同)

Nic*_*net 21

有一个名为rimraf的包非常方便.它是节点的UNIX命令rm -rf.

然而,它也可能过于强大,因为您可以使用它轻松删除文件夹.以下命令将删除文件夹中的文件.如果删除*,则将删除日志文件夹.

const rimraf = require('rimraf');
rimraf('./log/*', function () { console.log('done'); });
Run Code Online (Sandbox Code Playgroud)

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

  • @AdityaAnand - 什么功能?如果不导入一些包或自己编写大量代码是不可能的 (3认同)
  • 此命令无法删除以点开头的文件 (2认同)
  • IMO,可以用函数解决的问题,永远不应该用包来解决。 (2认同)

Sam*_*lam 16

是的,有一个模块fs-extra.emptyDir()这个模块中有一个方法可以完成这项工作。这是一个例子:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)
Run Code Online (Sandbox Code Playgroud)

该模块也有一个异步版本。任何人都可以签出链接。

  • 只是一点警告,这种方式的行为与问题所需的行为略有不同,因为“emptyDir”函数会在目录不存在时创建该目录。 (4认同)
  • 非常有用的模块,你应该尝试一下,有很多功能你一定会喜欢的。 (3认同)

Jas*_*Kim 10

基于@ Waterscroll的响应,如果要在节点8+中使用async和await:

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();
Run Code Online (Sandbox Code Playgroud)


And*_*nis 5

简单的 Node 10 解决方案

import fs from 'fs/promises'

await fs.readdir('folder').then((f) => Promise.all(f.map(e => fs.unlink(e))))
Run Code Online (Sandbox Code Playgroud)


ele*_*vir 5

还有另一种选择:

import {mkdir, rm} from 'fs/promises';

async function clearDirectory(dirPath) {
    await rm(dirPath, {recursive: true});
    await mkdir(dirPath);
}

Run Code Online (Sandbox Code Playgroud)

这实际上完全删除该目录(使用rm),但随后立即重新创建它,因此看起来它只是被清空了。这将影响文件夹元数据和可能的所有权,因此它不适用于所有用例。