3

我在迭代某个目录中的所有文件时使用 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] => .)

我想这只是使用 $file var 作为参数的一些菜鸟问题,但不知道如何使其工作。

谢谢阅读!

4

3 回答 3

6

正如 Kolink 在评论中所说,你可能最好走这glob条路,但如果你决定坚持使用 opendir:

路径将是 $folder 。'/' 。$file,而不仅仅是 $file。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”的文件夹将评估为假(或其他一些边缘情况)。此外,您很少会真正关心.and ..,因此代码可以在那里过滤...排除。

于 2012-05-07T21:32:37.167 回答
3

问题是:$file 只包含基本名称,而不是绝对文件名。所以预先添加文件夹的路径:

is_dir($folder . '/' . $file)
于 2012-05-07T21:32:07.717 回答
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++;
}
?>
于 2015-09-18T14:09:40.127 回答