nodejs如何判断目录是不是为空目录

Posted

技术标签:

【中文标题】nodejs如何判断目录是不是为空目录【英文标题】:how to determine whether the directory is empty directory with nodejsnodejs如何判断目录是否为空目录 【发布时间】:2017-01-06 03:14:50 【问题描述】:

我已经搜索了Nodejs Doc,但是没有找到相关的API。

所以我写了下面的代码来判断目录是否为空目录。

var fs = require('fs');

function isEmptyDir(dirnane)
    try
        fs.rmdirSync(dirname)
    
    catch(err)
        return false;
    
    fs.mkdirSync(dirname);
    return true

问题:看起来有些麻烦,用 nodejs 有更好的方法吗?

【问题讨论】:

【参考方案1】:

我想我想知道你为什么不只列出目录中的文件并查看是否有任何文件返回?

fs.readdir(dirname, function(err, files) 
    if (err) 
       // some sort of error
     else 
       if (!files.length) 
           // directory appears to be empty
       
    
);

当然,您也可以制作一个同步版本。

当然,这并不能保证目录中没有任何内容,但它确实意味着没有您有权查看的公共文件。


这是一个函数形式的 promise 版本,适用于较新版本的 nodejs:

function isDirEmpty(dirname) 
    return fs.promises.readdir(dirname).then(files => 
        return files.length === 0;
    );

【讨论】:

合理,但如果目录中有很多(即可能有数千个以上)文件,则可能会严重影响性能(时间和内存)。 @user3570671 - 你还有什么建议?而且,您是否有任何证据表明在包含 1000 个文件的目录上执行此操作实际上会导致明显的性能问题? 在下面的帖子中有一些讨论。我不一定推荐的唯一替代方法是使用“rmdir”和检查失败。 ***.com/questions/14577960/… @user3570671 - 你认为其中任何一个比列出文件更有效吗?仅供参考,操作系统非常擅长为您提供目录中的文件列表,即使有数千个。当今的现代文件系统围绕高效的目录访问进行了大量优化。例如,使用 fs.rmdir 后跟 fs.mkdir 的想法需要多次磁盘写入(不只是在目录为空时读取)。而且,所有其他涉及运行 shell 命令的解决方案都意味着启动一个新进程。 @user3570671 - 所以,如果你想走得更快,你可能会编写自己的操作系统特定和操作系统优化的 node.js 插件,在 C 代码中执行此操作并保存构建javascript 文件名字符串数组,甚至可能使用操作系统级别的目录属性访问(node.js 不会公开)。但是,如果这值得麻烦,我会感到非常惊讶。【参考方案2】:

您尝试的简单同步功能:

const fs = require('fs');

function isEmpty(path) 
    return fs.readdirSync(path).length === 0;

【讨论】:

【参考方案3】:

有可能使用为目录创建迭代器的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 值会告诉你目录是否为空

【讨论】:

只有在 dirIter 未完成时才应调用 close(): if (!done) await dirIter.close()

以上是关于nodejs如何判断目录是不是为空目录的主要内容,如果未能解决你的问题,请参考以下文章

nodejs 判断文件属性-目录或者文件

nodejs——避免判断创建多级目录

nodejs获取文件信息,判断是文件或目录

如何判断 FTP 目录是不是存在

如何判断(在 sh 中)一个目录是不是挂载在 NFS 上

如何判断 Linux 机器上的目录是不是在 Java 中安装了外部文件系统?