Node.js:如何在不上传文件列表的情况下检查文件夹是不是为空

Posted

技术标签:

【中文标题】Node.js:如何在不上传文件列表的情况下检查文件夹是不是为空【英文标题】:Node.js: How to check if folder is empty or not with out uploading list of filesNode.js:如何在不上传文件列表的情况下检查文件夹是否为空 【发布时间】:2013-01-12 17:33:24 【问题描述】:

我正在使用Node.js

我想检查文件夹是否为空?一种选择是使用 fs.readdir ,但它会将一大堆文件加载到一个数组中。 我的文件夹中有超过 10000 个文件。加载文件名只是为了检查文件夹是否为空。所以寻找替代解决方案。

【问题讨论】:

【参考方案1】:

复制我在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 值会告诉你目录是否为空

【讨论】:

【参考方案2】:

如何使用节点原生fs 模块http://nodejs.org/api/fs.html#fs_fs_readdir_path_callback。它的readdirreaddirSync 函数为您提供了所有包含文件名的数组(不包括...)。如果长度为0,则您的目录为空。

【讨论】:

他想避免调用 fs,readdir() 因为目标目录可能包含 很多 个文件。 我知道,但在发布问题时,这不是必需的。我想我会把它留作参考。【参考方案3】:

顺便补充一下,有一个节点模块extfs,可以使用函数isEmpty()检查目录是否为空,如下面的代码sn-p所示:

var fs = require('extfs');

fs.isEmpty('/home/myFolder', function (empty) 
  console.log(empty);
);

查看有关此函数同步版本的文档链接。

【讨论】:

extfs' isEmpty 函数在内部也使用 fs.readDir。因此,它无论如何都会加载所有文件名。 github.com/codexar/npm-extfs/blob/master/extfs.js#L65-70【参考方案4】:

您可以使用 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;
    
);

【讨论】:

plusone:在特定情况下,这是实现目标的“最佳”方式。【参考方案5】:

通配符呢?即exists myDir/*。节点不支持开箱即用(TOW v0.10.15),但一堆模块会为你做这件事,比如minimatch

【讨论】:

【参考方案6】:

这是一个丑陋的黑客,但无论如何我都会把它扔掉。您可以在目录上调用fs.rmdir。如果回调返回包含code: 'ENOTEMPTY' 的错误,则它不为空。如果成功,那么您可以致电fs.mkdir 并替换它。如果您的脚本是首先创建目录的脚本,并且具有适当的权限等,此解决方案可能才有意义。

【讨论】:

以上是关于Node.js:如何在不上传文件列表的情况下检查文件夹是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 node.js 的情况下添加标准反应应用程序 [关闭]

如何在不使用 npm 的情况下安装 node.js 模块?

NODE.JS 如何在不填满存储空间的情况下保存 JSON 数据 [关闭]

如何在不导致停机的情况下部署 Node.js 应用程序

如何在不使用或隐藏的情况下上传图片?

在 Node.js 中使用 POST 请求上传文件