如何从目录中删除所有文件而不在Node.js中删除目录


101

如何使用Node.js从目录中删除所有文件而不删除目录本身?
我想删除临时文件。我对文件系统还不好。

我已经找到了方法,它将删除文件和目录。在那种情况下,类似的东西/path/to/directory/*将无法工作。

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


2
如果要使用通配符,请查看npmjs.org/package/glob
菲利克斯·克林

1
只是看一下api,到底有什么难做?您必须将文件放在目录中,然后将其删除。
西科斯基2014年

2
Glob完成了工作,谢谢!
youbetternot 2014年

Answers:


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了,因此这是一个奖励,不需要额外的程序包。我只是将“ test”换成path.join(__ dirname,'../../public/uploads')
俄国

3
要添加2p,此代码段很棒,并且要记住的一件事就是它是异步的,在脚本编写/自动化情况下,您可能要使用它的同步版本fs.readdirSync。只需分配所有文件:const files = fs.readdirSync(directory);并以相同的方式循环for (const file of files) {
揭露

如何在“ test”目录中排除文件夹“ .git”
5ervant

您可以在for循环中添加一个if语句来删除这种情况,但是如果您要递归删除文件和文件夹,则可能需要使用一些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

有称为rimraf的软件包,非常方便。它是用于节点的UNIX命令rm -rf。

但是,它也可能太强大了,因为您可以使用它很容易地删除文件夹。以下命令将删除文件夹中的文件。如果删除*,将删除日志文件夹。

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

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


IMO,可以用功能解决的问题,决不能使用软件包来解决。
Aditya Anand

1
@AdityaAnand-什么功能?不导入某些包或自己编写大量代码,这是不可能的
vsync

12

如果您要在节点8+中使用async并等待,请以@Waterscroll的响应为基础:

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 '18

1
请注意,这return await Promise是多余的。你可以做return Promise。该toRun函数是异步的,因此当返回promise时,应用程序可以等待它。
ItalyPaleAle

const { promises: fs } = require('fs');我相信您现在可以从节点10+使用。
Shikyo

0

🚀graph -fs


安装

npm i graph-fs

使用

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

directory.clear(); // <--
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.