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

如何使用 Node.js 在不删除目录本身的情况下删除目录中的所有文件?
我想删除临时文件。我对文件系统还不太熟悉。

我已经找到了 这个方法,它将删除文件和目录。

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

175667 次浏览

要从目录中删除所有文件,首先需要使用 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));
}

有一个叫做 rimraf 的包非常方便,它是用于节点的 UNIX 命令 rm-rf。

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

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

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

如果您希望使用异步并在节点8 + 中等待,那么以@Waterroll 的响应为基础:

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

是的,有一个模块 额外的。在这个模块中有一个方法 .emptyDir()来完成这项工作。这里有一个例子:

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


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

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

运行命令行怎么样:

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

使用异步和承诺对 Rodrigo 的 回答进行改进

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)

短香草节点10解决方案

import fs from 'fs/promises'


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

如果你得到这个错误:

[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}`))))

它也可以通过一个同步的一行程序来完成,而不需要依赖性:

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


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

Something 你可以使用 graph-fs 提问

directory.clear() // empties it

目录清除工具函数的承诺版本:

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

还有另一种选择:

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


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


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

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


});

这可以通过使用香草 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);
const fs = require("fs");
fs.rmSync(dir, { recursive: true, force: true });