2008-10-10 59 views
2

我正在使用下面的代碼來遍歷目錄來打印出文件的名稱。但是,並非所有文件都顯示出來。我試過用clearstatcache沒有任何效果。PHP readdir沒有讀取一些文件

$str = ''; 
    $ignore = array('.', '..'); 

    $dh = @opendir($path); 
    if ($dh === FALSE) 
    { 
     // error 
    } 

    $file = readdir($dh); 
    while($file !== FALSE) 
    { 
     if (in_array($file, $ignore, TRUE)) { break; } 
     $str .= $file."\n"; 
     $file = readdir($dh); 
    } 

這裏的目錄的內容現在:

root.auth test1.auth test2.auth test3.auth test5.auth 

然而,test5.auth不會出現。如果我將它重命名爲test4.auth,它不會出現。如果我將它重命名爲test6.auth,它會出現確實。這是可靠的行爲 - 我可以多次重命名它,除非將其重命名爲test6.auth,否則它將不會顯示。

究竟會發生什麼?

我正在用PHP 5.2.6版本運行Arch Linux(內核2.6.26-ARCH)和Suhosin-Patch運行Apache/2.2.9。我的文件系統是ext3,我正在運行fam 2.6.10。

回答

1

您的break關鍵字混淆了您的代碼:
您的循環很可能首先遇到'。'目錄,並打破你的while循環。

嘗試用continue代替它,你應該沒問題。

+0

D'哦!男人,我現在覺得自己很愚蠢。謝謝! – HoboBen 2008-10-10 14:24:22

+0

只是新鮮的一雙眼睛。 – Jacco 2008-10-10 14:42:58

1
if (in_array($file, $ignore, TRUE)) { break; } 

當然這應該是continuebreak

3

繼續也不起作用,因爲您將跳過讀取下一個文件的行。

你可以擺脫第一$file = readdir($dh);,然後做

while (false !== ($file = readdir($dh))) { 
    if (in_array($file, $ignore, TRUE)) { continue; } 
    $str .= $file."\n"; 
}