【发布时间】:2013-01-12 17:33:24
【问题描述】:
我正在使用Node.js。
我想检查文件夹是否为空?一种选择是使用 fs.readdir ,但它会将一大堆文件加载到一个数组中。 我的文件夹中有超过 10000 个文件。加载文件名只是为了检查文件夹是否为空。所以寻找替代解决方案。
【问题讨论】:
我正在使用Node.js。
我想检查文件夹是否为空?一种选择是使用 fs.readdir ,但它会将一大堆文件加载到一个数组中。 我的文件夹中有超过 10000 个文件。加载文件名只是为了检查文件夹是否为空。所以寻找替代解决方案。
【问题讨论】:
复制我在how to determine whether the directory is empty directory with nodejs的回答
有可能使用为目录创建迭代器的opendir 方法调用。
这将消除读取所有文件的需要并避免潜在的内存和时间开销
import {promises as fsp} from "fs"
const dirIter = await fsp.opendir(_folderPath);
const {value,done} = await dirIter[Symbol.asyncIterator]().next();
await dirIter.close()
done 值会告诉你目录是否为空
【讨论】:
如何使用节点原生fs 模块http://nodejs.org/api/fs.html#fs_fs_readdir_path_callback。它的readdir 和readdirSync 函数为您提供了所有包含文件名的数组(不包括. 和..)。如果长度为0,则您的目录为空。
【讨论】:
顺便补充一下,有一个节点模块extfs,可以使用函数isEmpty()检查目录是否为空,如下面的代码sn-p所示:
var fs = require('extfs');
fs.isEmpty('/home/myFolder', function (empty) {
console.log(empty);
});
查看有关此函数同步版本的文档链接。
【讨论】:
您可以使用 exec() 从 NodeJS 中执行任何 *nix shell 命令。因此,为此您可以使用旧的 'ls -A ${folder} | wc -l' 命令(列出 ${folder} 中包含的所有文件/目录,将当前目录 (.) 和父目录 (..) 的条目隐藏在要从计数中排除的输出中,并计算它们的号)。
例如,如果 ./tmp 不包含以下文件/目录,则会显示“目录 ./tmp 为空。”。否则,它将显示它包含的文件/目录的数量。
var dir = './tmp';
exec( 'ls -A ' + dir + ' | wc -l', function (error, stdout, stderr) {
if( !error ){
var numberOfFilesAsString = stdout.trim();
if( numberOfFilesAsString === '0' ){
console.log( 'Directory ' + dir + ' is empty.' );
}
else {
console.log( 'Directory ' + dir + ' contains ' + numberOfFilesAsString + ' files/directories.' );
}
}
else {
throw error;
}
});
【讨论】:
通配符呢?即exists myDir/*。节点不支持开箱即用(TOW v0.10.15),但一堆模块会为你做这件事,比如minimatch
【讨论】:
这是一个丑陋的黑客,但无论如何我都会把它扔掉。您可以在目录上调用fs.rmdir。如果回调返回包含code: 'ENOTEMPTY' 的错误,则它不为空。如果成功,那么您可以致电fs.mkdir 并替换它。如果您的脚本是首先创建目录的脚本,并且具有适当的权限等,此解决方案可能才有意义。
【讨论】: