2011-09-21 94 views
60

我正在使用以下脚本来读取目录。如果目录中没有文件,它应该显示为空。问题是,即使存在内部文件,它仍然说目录是空的,反之亦然。使用如何使用PHP来检查一个目录是否为空?

<?php 
$pid =  $_GET["prodref"]; 
$dir =  '/assets/'.$pid.'/v'; 
$q  =  (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; 

    if ($q=="Empty") 
     echo "the folder is empty"; 
    else 
     echo "the folder is NOT empty"; 
?> 
+8

这只是一个错字在你的if语句。使用==(比较)而不是单个=(分配)。 –

回答

107

看来你需要scandir而不是水珠,水珠如无法看到UNIX隐藏文件。

<?php 
$pid = basename($_GET["prodref"]); //let's sanitize it a bit 
$dir = "/assets/$pid/v"; 

if (is_dir_empty($dir)) { 
    echo "the folder is empty"; 
}else{ 
    echo "the folder is NOT empty"; 
} 

function is_dir_empty($dir) { 
    if (!is_readable($dir)) return NULL; 
    return (count(scandir($dir)) == 2); 
} 
?> 

请注意,此代码不是效率的峰会,因为它不需要读所有文件只告诉我们,如果目录为空。所以,更好的版本将是

function dir_is_empty($dir) { 
    $handle = opendir($dir); 
    while (false !== ($entry = readdir($handle))) { 
    if ($entry != "." && $entry != "..") { 
     return FALSE; 
    } 
    } 
    return TRUE; 
} 

顺便说一句,不要用替代布尔值。后者的目的是告诉你是否有空。一个

a === b 

表达已返回各自的编程语言,FALSETRUE方面EmptyNon Empty - 所以,你可以使用很结果控制结构像IF()没有任何中间值

+2

我认为我们的代码都是错误的,因为我从文件夹中删除了所有文件,但仍然说文件夹不是空的......有没有办法检查隐藏文件,如thumbs.db等在Linux? – TheBlackBenzKid

+0

我认为FTP文件夹是说..和。在文件中是空的。我如何检查和删除..和thumbs.db等? – TheBlackBenzKid

+0

glob不支持linux隐藏文件。如果你想要他们,你必须去像openir解决方案 –

7

if ($q == "Empty") 

代替

if ($q="Empty") 
4

可能是因为在if声明赋值运算符。

变化:

if ($q="Empty") 

要:

if ($q=="Empty") 
4

试试这个:

<?php 
$dirPath = "Add your path here"; 

$destdir = $dirPath; 

$handle = opendir($destdir); 
$c = 0; 
while ($file = readdir($handle)&& $c<3) { 
    $c++; 
} 

if ($c>2) { 
    print "Not empty"; 
} else { 
    print "Empty"; 
} 

?> 
+0

谢谢!我写得很快,我的第一篇文章在这里@Piotr Nowicki – Drmzindec

+0

当然,这只是我的公民责任;-)欢迎来到StackOverflow! –

1

@你的常识

我觉得你高性能的例子可能是更好的性能,采用严格的比较:

function is_dir_empty($dir) { 
    if (!is_readable($dir)) return null; 
    $handle = opendir($dir); 
    while (false !== ($entry = readdir($handle))) { 
    if ($entry !== '.' && $entry !== '..') { // <-- better use strict comparison here 
     closedir($handle); // <-- always clean up! Close the directory stream 
     return false; 
    } 
    } 
    closedir($handle); // <-- always clean up! Close the directory stream 
    return true; 
} 
+1

关于清理的好处:'返回false'案件没有照顾它;-) –

+0

@BeatChristen Thx的提示!修复。 –

2

就纠正你这样的代码:

<?php 
    $pid = $_GET["prodref"]; 
    $dir = '/assets/'.$pid.'/v'; 
    $q = count(glob("$dir/*")) == 0; 

    if ($q) { 
     echo "the folder is empty"; 
    } else { 
     echo "the folder is NOT empty"; 
    } 
?> 
54

我认为使用FilesystemIterator应该是最快,最简单的方法:

// PHP 5 >= 5.3.0 
$iterator = new \FilesystemIterator($dir); 
$isDirEmpty = !$iterator->valid(); 

或者在实例化时使用类成员访问:

// PHP 5 >= 5.4.0 
$isDirEmpty = !(new \FilesystemIterator($dir))->valid(); 

这是有效的,因为新的FilesystemIterator最初将指向文件夹中的第一个文件 - 如果文件夹中没有文件,valid()将返回false。 (请参阅文档here。)

正如abdulmanov.ilmir指出的那样,在使用FileSystemIterator之前可以选择检查目录是否存在,否则会抛出UnexpectedValueException

+3

嗯......我的腰刺痛了这个。 –

+0

它就像一个大象的魅力5.3 – userlond

+1

你应该考虑如果'$ dir'不存在则会抛出一个异常。 –

8

我找到了一个快速的解决方案

<?php 
    $dir = 'directory'; // dir path assign here 
    echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; 
?> 
+1

此代码适用于我。 –

+0

我在php 5.2中使用的解决方案适用于简单情况。 –

0

我在WordPress的CSV 2 POST插件使用此方法。

public function does_folder_contain_file_type($path, $extension){ 
     $all_files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); 

     $html_files = new RegexIterator($all_files, '/\.'.$extension.'/'); 

     foreach($html_files as $file) { 
      return true;// a file with $extension was found 
     } 

    return false;// no files with our extension found 
} 

它通过特定的扩展,但很容易改变通过删除“新RegexIterator(”线,以满足您的需求。数$ all_files。

public function does_folder_contain_file_type($path, $extension){ 
     $all_files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); 

     return count($all_files); 
    } 
0

最近我也有类似的问题,虽然,在最高票数的答案对我来说并不真实,因此,我不得不提出类似的解决方案,并且这也可能不是解决问题的最有效方式,我创建了一个类似于所以

function is_empty_dir($dir) 
    { 
     if (is_dir($dir)) 
     { 
      $objects = scandir($dir); 
      foreach ($objects as $object) 
      { 
       if ($object != "." && $object != "..") 
       { 
        if (filetype($dir."/".$object) == "dir") 
        { 
         return false; 
        } else { 
         return false; 
        } 
       } 
      } 
      reset($objects); 
      return true; 
     } 

,并用它来检查空dricetory像这样

if(is_empty_dir($path)){ 
      rmdir($path); 
     } 
4

这是一个非常古老的线程,但我想我给我一毛钱。其他解决方案不适合我。

这里是我的解决方案:

function is_dir_empty($dir) { 
    foreach (new DirectoryIterator($dir) as $fileInfo) { 
     if($fileInfo->isDot()) continue; 
     return false; 
    } 
    return true; 
} 

简短而亲切。奇迹般有效。

4

对于使用Standard PHP Library (SPL)中的RecursiveDirectoryIterator的面向对象的方法。

<?php 

namespace My\Folder; 

use RecursiveDirectoryIterator; 

class FileHelper 
{ 
    /** 
    * @param string $dir 
    * @return bool 
    */ 
    public static function isEmpty($dir) 
    { 
     $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); 
     return iterator_count($di) === 0; 
    } 
} 

无需做出任何你需要你这样的FileHelper只要你需要它,你可以访问此静态方法的一个实例:

FileHelper::isEmpty($dir); 

FileHelper类可以用其他有用的扩展复制,删除,重命名等方法。

没有必要检查方法内的目录的有效性,因为如果它是无效的,RecursiveDirectoryIterator的构造函数将抛出一个它充分地覆盖那个部分的UnexpectedValueException

0

您可以使用此:

function isEmptyDir($dir) 
{ 
    return (($files = @scandir($dir)) && count($files) <= 2); 
} 
相关问题