【问题标题】:is_dir does not recognize foldersis_dir 无法识别文件夹
【发布时间】:2010-06-08 14:02:54
【问题描述】:

我正在尝试制作一个扫描文件夹以查找子文件夹然后返回的函数 包含这些文件夹名称的数值数组。

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

<?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}";}
    }

该函数只打印“.”和 ".." ,而不是我希望它打印的两个文件夹名称。

感谢任何帮助。

【问题讨论】:

  • 请编辑您的问题,以便代码可读
  • 感谢您的审核,使代码可读。上次我在帖子中添加代码时,它说我添加代码的权限太少。尝试将其包含在 php 中,但它仍然只将 while 部分识别为代码。

标签: php directory


【解决方案1】:

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

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

【讨论】:

  • 那里不需要引号。 echo $file 工作得很好。此外,变量插值无论如何都对双引号起作用,因此您也不需要大括号。
  • 变量插值对我来说是一个新词,但是,我看到代码在没有大括号的情况下执行相同。 (查找变量插值)感谢您的快速回答,代码现在可以工作了。
  • 如果你在没有大括号的情况下这样做,也可以在没有引号的情况下这样做,这是 a.t.m.只是一个不必要的步骤。
【解决方案2】:

readdir 的问题在于它只读取目录内命名条目的字符串。

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

通常,如果它与脚本的当前工作目录位于同一目录中,这不会有问题,但是,由于您正在从任意目录读取,因此当您尝试检查条目(文件、目录,无论如何),您在裸字符串“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);
}

【讨论】:

  • 这和上面的答案都有效。感谢您的快速回复。
【解决方案3】:

你需要使用:

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

http://php.net/readdir

【讨论】:

  • 感谢您的回复,看起来像是上面两个答案的另一个版本。
【解决方案4】:

如果你只想要起始文件夹的目录,你可以这样做:

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

这只会为您提供数组中的那些文件夹名称。如果您想要给定路径下的所有目录,请尝试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,其中包含给定路径下的所有目录。

【讨论】:

    【解决方案5】:
    $files = array();
    foreach(new DirectoryIteraror('/path') as $file){
        if($file->isDir() /* && !$file->isDot()*/) $files[] = $file->getFilename();
    }
    

    [编辑:虽然你想跳过点,但将其注释掉)

    【讨论】:

      【解决方案6】:

      我认为你不需要file_existsis_dir

      您只需要is_dir 函数。来自手册:

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

      使用这个:

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

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

      【讨论】:

      • 我不确定是谁决定对我投反对票,但这可行。我已经在本地 apache 服务器上对其进行了测试。
      • 无论$handle在哪个目录打开,它都会测试脚本当前工作目录中的目录是否存在。它确实没有按预期工作。
      • 尝试打开$handle 到一个不是当前文件夹的目录。
      【解决方案7】:
              $directory = scandir($path);
                  foreach($directory as $a){
                      if(is_dir($path.$a.'/') && $a != '.' && $a != '..'){
                      echo $a.'<br/>';        
                      }
                  }
      

      使用如图所示的路径,它会显示路径中存在的文件夹。

      【讨论】:

        【解决方案8】:

        我同意 nuqqsa 的解决方案,不过,我想补充一点。

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

        例如,

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

        【讨论】:

        • 这最终是不好的做法;从 PHP 执行路径中的任何位置调用 chdir 将更改脚本执行其余部分的 整个 的当前工作目录。 IE。如果 foo.php include s bar.php,它执行 chdir,它将在 bar.php 包含后更改 foo.php 中所有内容的工作目录。
        猜你喜欢
        • 2021-12-10
        • 2016-01-01
        • 2015-01-13
        • 2021-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多