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

How to remove all files from directory without removing directory in Node.js

本文关键字:删除 文件 情况下 js Node      更新时间:2023-09-26

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

我找到了这种方法,它将删除文件和目录。在这种情况下,像/path/to/directory/*这样的东西是行不通的。

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

要从目录中删除所有文件,首先需要使用 fs.readdir 列出目录中的所有文件,然后可以使用 fs.unlink 删除每个文件。此外,fs.readdir只会给出文件名,您需要与目录名称连接以获取完整路径。如果您的文件夹中有其他文件夹,则需要检查它并改用fs.rmdir

这是一个例子

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

使用承诺

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

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

// NON-ES6 EXAMPLE
const fsExtra = require('fs-extra');
fsExtra.emptyDirSync(fileDir);
// ES6 EXAMPLE
import * as fsExtra from "fs-extra";
fsExtra.emptyDirSync(fileDir);

这个模块还有一个异步版本。任何人都可以查看链接。

有一个叫做rimraf的软件包非常方便。它是 UNIX 命令 rm -rf for node。

尽管如此,它

也可能太强大了,因为您可以使用它非常轻松地删除文件夹。以下命令将删除文件夹中的文件。如果删除 *,则将删除日志文件夹。

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

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

也可以使用没有依赖关系的同步单行代码来完成:

const { readdirSync, rmSync } = require('fs');
const dir = './dir/path';
readdirSync(dir).forEach(f => rmSync(`${dir}/${f}`));

基于@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();

简短的香草节点 10 解决方案

import fs from 'fs/promises'
await fs.readdir('folder').then((f) => Promise.all(f.map(e => fs.unlink(e))))

另一种选择:

import {mkdir, rm} from 'fs/promises';
async function clearDirectory(dirPath) {
    await rm(dirPath, {recursive: true});
    await mkdir(dirPath);
}

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

运行命令行怎么样:

require('child_process').execSync('rm -rf /path/to/directory/*')

承诺版本的目录清理实用程序功能:

const fs = require('fs').promises; // promise version of require('fs');
async function cleanDirectory(directory) {
    try {
        await fs.readdir(directory).then((files) => Promise.all(files.map(file => fs.unlink(`${directory}/${file}`))));
    } catch(err) {
        console.log(err);
    }
}
cleanDirectory("./somepath/myDir");
改进了

罗德里戈的答案,使用异步和承诺

const fs = require('fs').promises;
const path = require('path');
const directory = 'test';
let files = [];
try{
   files = await fs.readdir(directory);
}
catch(e){
   throw e;
}
if(!files.length){
  return;
}
const promises = files.map(e => fs.unlink(path.join(directory, e)));
await Promise.all(promises)
const fs = require("fs");    
fs.rmSync(dir, { recursive: true, force: true });

如果收到此错误:

[Error: ENOENT: no such file or directory, unlink 'filename.js'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'unlink',
  path: 'filename.js'
}

添加文件夹路径

const folderPath = './Path/to/folder/'
await fs.promises.readdir(folderPath)
    .then((f) => Promise.all(f.map(e => fs.promises.unlink(`${folderPath}${e}`))))

这可以通过vanilla nodejs依赖项来完成:

const fs = require('fs');
const dir = 'www/foldertoempty';
fs.readdirSync(dir).forEach(f=>fs.rmdirSync(
`${dir}/${f}`,
{
recursive : true,
force : true 
}
));

添加递归和强制可确保非空文件夹也被删除。

接受

答案的一行

import { join } from 'path';
import { readdir, unlink } from 'fs/promises';
await Promise.all((await readdir(dir)).map((file) => unlink(join(dir, file))));
const fsExtra = require('fs-extra')
let dir = "./temp";
await fsExtra.emptyDir(dir);

❄️您可以使用graph-fs ↗️

directory.clear() // empties it
const fs = require();
fs.readdir('test', (err, files) => {
    if (err) throw err;
    for (let file of files) 
        fs.unlink('./test/' + file, (err) => {
            if (err) throw err;
        });
    return fs.rmdir('test', (err) => {
        if (err) throw err;
        console.log('folder is deleted');
    });
});