【问题标题】: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 个文件。加载文件名只是为了检查文件夹是否为空。所以寻找替代解决方案。

【问题讨论】:

    标签: file node.js directory fs


    【解决方案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);
      });
      

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

      【讨论】:

      【解决方案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 并替换它。如果您的脚本是首先创建目录的脚本,并且具有适当的权限等,此解决方案可能才有意义。

        【讨论】:

          猜你喜欢
          • 2015-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多