Php _dir是否未按预期工作
我在迭代某个目录中的所有文件时,使用is_dir时遇到了一个问题。 代码有点小,所以我想如果我发布它,你会更好地理解我的意思:Php _dir是否未按预期工作,php,arrays,directory,dir,Php,Arrays,Directory,Dir,我在迭代某个目录中的所有文件时,使用is_dir时遇到了一个问题。 代码有点小,所以我想如果我发布它,你会更好地理解我的意思: $files = array(); if ($dir = @opendir($folder)){ while($file = readdir($dir)){ if (is_dir($file)) $files[] = $file; } closedir($dir); } print_r($fil
$files = array();
if ($dir = @opendir($folder)){
while($file = readdir($dir)){
if (is_dir($file)) $files[] = $file;
}
closedir($dir);
}
print_r($files)
它转储:
([0]=>)
否则,如果我不使用以下代码检查文件是否为dir:
$files = array();
if ($dir = @opendir($folder)){
while($file = readdir($dir)){
$files[] = $file;
}
closedir($dir);
}
print_r($files)
它转储了预期的内容:
([0]=>..[1]=>bla[2]=>blabla[3]=>index.php[4]=>style.css[5]=>)
我想使用$file变量作为参数只是一个noob问题,但不知道如何使其工作
谢谢你的阅读 问题是:$file只包含basename,而不包含绝对文件名。因此,请在文件夹的路径前添加前缀:
is_dir($folder . '/' . $file)
正如Kolink在评论中所说,您最好选择
glob
路线,但如果您决定坚持使用opendir:
路径将为$folder.'/'$文件,而不仅仅是$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”的文件夹将计算为false(或其他一些边缘情况)。此外,您很少真正关心
和。
,因此代码在那里可以过滤
和。
。
<? // 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++;
}
?>
是否只需要所有子目录的列表?如果是这样,请使用glob(),因为您似乎正在为之重新发明轮子。如果是这种情况,问题已经解决;)好的,问题解决了,多亏了你们,速度非常快,不知道这个glob选项,也不知道opendir的相对路径。谢谢<代码>
和。
是自动出现在每个目录中的特殊目录<代码>=当前目录,。
=父目录。除非过滤掉它们,否则它们将始终显示在opendir/readdir中。检查您在$file中得到的内容。如果您只获得文件名,那么请在父目录路径前添加前缀谢谢您的回答。正如我在第一条评论中所说,已经解决了这个问题。