我正在使用Node.js
。
我想检查文件夹是否为空?一种选择是使用fs.readdir,但是它将整个文件加载到数组中。我的文件夹中有超过10000个文件。仅检查文件夹是否为空,加载文件名没有用。因此,正在寻找替代解决方案。
如何使用本机fs
模块http://nodejs.org/api/fs.html#fs_fs_readdir_path_callback的节点。它的readdir
和readdirSync
函数为您提供了所有包含的文件名的数组(.
和..
除外)。如果长度为0
,则您的目录为空。
这是一个丑陋的技巧,但我还是会把它扔出去。您可以仅在目录上调用fs.rmdir
。如果回调返回包含code: 'ENOTEMPTY'
的错误,则该错误不为空。如果成功,则可以调用fs.mkdir
并替换它。仅当您的脚本是首先创建目录,具有适当权限等的脚本时,此解决方案才有意义。
您可以使用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
只需添加一个节点模块extfs,可使用功能isEmpty()来检查目录是否为空,如以下代码片段所示:
var fs = require('extfs');
fs.isEmpty('/home/myFolder', function (empty) {
console.log(empty);
});
查看此功能的同步版本的文档链接。
与我在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()
完成值将告诉您目录是否为空