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

jsi*_*ist 16 directory file fs node.js

我在用Node.js.

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

Jon*_*upp 13

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

  • 他想避免调用fs,readdir()becoz目标目录可能包含*很多*文件. (2认同)
  • 我知道,但在发布问题时,这不是必需的.我以为我会把它留作参考. (2认同)

Dav*_*don 11

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


Kok*_*oka 6

您可以使用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;
    }
});
Run Code Online (Sandbox Code Playgroud)