2011-09-21 226 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); 
}