Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-查找目录是否有子目录的最快方法?_Php_Children_Dir - Fatal编程技术网

PHP-查找目录是否有子目录的最快方法?

PHP-查找目录是否有子目录的最快方法?,php,children,dir,Php,Children,Dir,我正在构建一个文件浏览器,我需要知道一个目录是否有子目录(但不知道有多少子目录或子目录的类型) 查找目录是否有子目录的最有效方法是什么全局()scandir()it?检查税务记录 编辑 看起来我被误解了,虽然我认为我很清楚。我会尽量重申我的问题 知道目录是否为空的最有效方法是什么?我基本上是在寻找一个布尔答案——不是空的或空的 我不需要知道: 目录中有多少文件 文件是什么 当它们被修改时 等等 我确实需要知道: 目录中有任何文件吗 有效。我认为这是非常有效的: 一旦找到文件或目录(不包

我正在构建一个文件浏览器,我需要知道一个目录是否有子目录(但不知道有多少子目录或子目录的类型)

查找目录是否有子目录的最有效方法是什么<代码>全局()
scandir()
it?检查税务记录

编辑

看起来我被误解了,虽然我认为我很清楚。我会尽量重申我的问题

知道目录是否为空的最有效方法是什么?我基本上是在寻找一个布尔答案——不是空的或空的

我不需要知道:

  • 目录中有多少文件
  • 文件是什么
  • 当它们被修改时
  • 等等
我确实需要知道:

  • 目录中有任何文件吗

有效。

我认为这是非常有效的:


一旦找到文件或目录(不包括
),它就会停止目录内容的列表。

您可以使用“查找”一步列出所有空目录:

exec("find '$dir' -maxdepth 1 -empty -type d",$out,$ret);
print_r($out);

它不是“纯粹”的php,而是简单快速的。

这应该可以做到,简单、快速、有效

<?php
function dir_is_empty($dir) {
  $dirItems = count(scandir($dir));
  if($dirItems > 2) return false;
  else return true;
}
?>

不幸的是,到目前为止,每个解决方案都缺乏必要的简洁和优雅,无法超越其他解决方案

因此,我被迫自己自制了一个解决方案,我将实施该解决方案,直到出现更好的解决方案:

if(count(glob($dir."/*")) { 
  echo "NOT EMPTY"; 
}

与其他方法相比,我仍然不确定这种方法的效率,这是最初的问题。

我想扩展vstm的答案-只检查子目录(而不是文件):


请参阅我对这个问题“”的回答,它将帮助您阅读目录我知道我发布了另一个答案,但我会将此标记为最佳答案,因为从理论上讲,如果您有一个包含100万个文件的目录,则此函数只会读取几行,而我的函数会将所有文件加载到一个数组中,然后对数组进行计数+(我给你的)无论如何,感谢vstm和Kristofer,但我更喜欢我自己的解决方案(如下),直到更好的解决方案出现。如果我是你,我会用@vstm POST的答案,它对有分配文件/子目录的目录更有效。Hmmm,这很有趣,尽管它打开了一个外壳:/但是我会看看,+1代表创意,谢谢你带来了一些新的东西。这取决于你的环境,它是否值得信任。。。我们主要使用固定操作系统部署设备,因此打开shell在这里不是一个大问题;-)对于windows:
$dir=escapeshellarg($dir);exec(“树$dir/a”,$out,$ret)
然后检查
$out
数组-比迭代快得多。仅供参考,这个答案非常适合递归列出目录,而无需迭代所有文件(如果有5000多个文件,任何迭代的PHP方法似乎都非常慢)。解析从Windows命令中获取的目录树并不有趣。这远不如vstm的答案有效。glob将把整个结果集放入内存。简洁!=优雅。你应该改变被接受的答案。我认为这不是最好的解决办法。效率在这里更为重要。
if(count(glob($dir."/*")) { 
  echo "NOT EMPTY"; 
}
/**
* Check if directory contains child directories.
*/
function dir_contains_children_dirs($dir) {
  $result = false;
    if($dh = opendir($dir)) {
       while (!$result && ($file = readdir($dh))) {
         $result = $file !== "." && $file !== ".." && is_dir($dir.'/'.$file);
       }
       closedir($dh);
    }

  return $result;
}