2012-05-07 32 views
1

我在遍歷某個目錄中的所有文件時使用is_dir時出現問題。 的代碼是那種小,所以我想你會更好地理解我的意思是,如果我將它張貼:is_dir按預期工作

$files = array(); 

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){ 

     if (is_dir($file)) $files[] = $file; 
    }   
    closedir($dir);  
} 
print_r($files) 

它轉儲: ([0] =>)

否則,如果我不請檢查是否文件是通過使用該碼的目錄:

$files = array(); 

if ($dir = @opendir($folder)){ 

    while($file = readdir($dir)){ 

     $files[] = $file; 
    }   
    closedir($dir);  
} 
print_r($files) 

它轉儲什麼預期: ([0] => .. [1] => BLA [2] => blablabla [3 ] => index.php [4] => styles.css [5] =>)

我想這只是一些小問題,使用$文件var作爲參數,但不知道如何使其工作。

感謝您的閱讀!

+0

你只是想列出所有的子目錄嗎?如果是這樣,請使用glob() – 2012-05-07 21:28:59

+1

您似乎正在爲['glob(「*」,GLOB_ONLYDIR)'](http://php.net/glob)重新發明輪子。如果是這樣,問題已經解決;) –

+0

Oks,問題解決了,謝謝你們,這很快,不知道這個glob選項,也不知道opendir的相對路徑。謝謝!! – LuthorMithos

回答

6

由於Kolink在評論中說,你可能會更好過會的glob路線,但如果你決定堅持由opendir:

的路徑將是$文件夾。 '/'。 $文件,而不僅僅是$文件。 opendir()返回相對路徑。所以is_dir在循環中返回false。

if ($dir = opendir($folder)){ 

    while(false !== ($file = readdir($dir))) { 
     if ($file == '.' || $file == '..') { 
      continue; 
     } else if (is_dir($folder . '/' . $file)) { 
      $files[] = $file; 
     } 
    } 

    closedir($dir);  

} 

另外,請注意false !==。這是必要的,因爲名爲「0」的文件夾將評估爲false(或其他一些邊緣情況)。此外,你很少會真正關心...,以便代碼在那裏過濾...

+0

之前加上回答。已經解決了它,正如我在第一條評論中所說的那樣。 – LuthorMithos

4

問題是:$ file只包含基本名稱,而不是絕對文件名。所以在前面加上文件夾的路徑:

is_dir($folder . '/' . $file) 
0
<? // findfiles.php - what is in directory "videoarchive" 
$dir = 'images/videoarchive/'; // path from top 
$files = scandir($dir); 
$files_n = count($files); 

echo '<br>There are '.$files_n.' records in directory '.$dir.'<br>' ; 

$i=0; 
while($i<=$files_n){ 
    // "is_dir" only works from top directory, so append the $dir before the file 
    if (is_dir($dir.'/'.$files[$i])){ 
     $MyFileType[$i] = "D" ; // D for Directory 
    } else{ 
     $MyFileType[$i] = "F" ; // F for File 
    } 
    // print itemNo, itemType(D/F) and itemname 
    echo '<br>'.$i.'. '. $MyFileType[$i].'. ' .$files[$i] ; 
    $i++; 
} 
?>