is_dir无法识别文件夹

时间:2010-06-08 14:02:55

标签: php directory

我正在尝试创建一个扫描文件夹以查找子文件夹然后返回的函数 带有这些文件夹名称的数字数组。

这是我用于测试的代码。一旦我得到它打印出文件夹名称而不仅仅是“。”对于现在和上面的文件夹,“..”一切都会很好,我可以完成这个功能。

<?php
function super_l_getthemes($dir="themes")
{

if ($handle = opendir($dir)) {
    echo "Handle: {$handle}\n";
    echo "Files:\n";


    while (false !== ($file = readdir($handle))) {
       echo "{$file}<br>";
    }

    closedir($handle);
}
?>

上面的代码工作正常,并打印出文件夹的所有内容:文件,子文件夹和“。”和“..”

但如果我替换:

  while (false !== ($file = readdir($handle))) {
       echo "{$file}<br>";
    }

使用:

while (false !== ($file = readdir($handle))) {
        if(file_exists($file) && is_dir($file)){echo "{$file}";}
    }

该功能仅打印“。”和“..”,而不是我想要打印的两个文件夹名称。

感谢任何帮助。

8 个答案:

答案 0 :(得分:6)

您必须提供file_exists的绝对路径,否则它将在当前执行路径中查找它。

while (false !== ($file = readdir($handle))) {
    $file_path = $dir . DIRECTORY_SEPARATOR . $file;
    if (file_exists($file_path) && is_dir($file_path)) {
        echo "{$file}";
    }
}

答案 1 :(得分:3)

readdir的问题是它只读取目录中命名条目的字符串。

例如,如果你在目录“/ path / to / files /”中有文件“foo”,那么当在“/ path / to / files /”上使用readdir时,你最终会来到字符串“foo”。

通常,如果它与脚本的当前工作目录位于同一目录中,则不会出现问题,但是,因为您正在从任意控制器读取,所以当您尝试检查该条目时(文件,目录) ,无论如何),你在裸字符串“foo”上调用is_dir

我会尝试使用readdir为您提取的名称添加前缀,并附上文件路径。


if ($handle = opendir($dir)) {
    echo "Handle: {$handle}\n";
    echo "Files:\n";

    while ($file = readdir($handle)) {
        /*** make $file into an absolute path ***/
        $absolute_path = $dir . '/' . $file;

        /*** NOW try stat'ing it ***/
        if (is_dir($absolute_path)) {
            /* it's a directory; do stuff */
        }
    }

    closedir($handle);
}

答案 2 :(得分:1)

您需要使用:

while (false !== ($file = readdir($handle))) {
    if(file_exists($dir.'/'.$file) && is_dir($dir.'/'.$file)){echo "{$file}";}
}

请参阅http://php.net/readdir

答案 3 :(得分:1)

如果您只想要起始文件夹的目录,只需执行以下操作:

glob('/some/path/to/search/in/*', GLOB_ONLYDIR);

它只会给你一个数组中的那些foldernames。如果您希望所有目录低于给定路径,请尝试SPL's RecursiveDirectoryIterator

$fileSystemIterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/some/path/to/look/in'),
    RecursiveIteratorIterator::SELF_FIRST);

迭代器可以与foreach一起使用:

$directories = array();
foreach($fileSystemIterator as $path => $fileSystemObject) {
    if($fileSystemObject->isDir()) {
        $directories[] = $path;
    }
}

然后,您将拥有一个数组$directories,其中包含给定路径下的所有目录。

答案 4 :(得分:0)

我认为您不需要file_existsis_dir

您只需要is_dir功能。从手册:

is_dir如果文件名存在且为目录,则返回TRUE,否则返回FALSE。

使用此:

while (false !== ($file = readdir($handle))) {
        if(is_dir($file)){echo "{$file}";}
    }

is_dir还会检查它是相对路径还是绝对路径。

答案 5 :(得分:0)

$files = array();
foreach(new DirectoryIteraror('/path') as $file){
    if($file->isDir() /* && !$file->isDot()*/) $files[] = $file->getFilename();
}

[编辑:虽然你想跳过点,然后评论出来)

答案 6 :(得分:0)

        $directory = scandir($path);
            foreach($directory as $a){
                if(is_dir($path.$a.'/') && $a != '.' && $a != '..'){
                echo $a.'<br/>';        
                }
            }

如图所示给出路径,它显示路径中存在的文件夹。

答案 7 :(得分:-2)

我同意nuqqsa的解决方案,但是,我想补充一些内容。

您可以改为更改当前目录,而不是指定路径。

例如,

// open directory handle
// ....
chdir($dir);
while (false !== ($file = readdir($handle)))
 if(is_dir($file))
  echo $file;
// close directory handle