【问题标题】:php readdir and is_dirphp readdir 和 is_dir
【发布时间】:2013-02-24 00:46:33
【问题描述】:

我正在测试目录处理的功能。我有一个包含以下内容的折叠/目录:

0 文件夹

false 文件夹

my_pictures 文件夹

MVI_3094 mov 文件

img01 jpeg 图片

等等……

我写了如下代码遍历目录,打印出具体的resutls

$handle = opendir("files/");
while(($entry = readdir($handle)) !== false)
{
    if($entry == "." || $entry == "..")
    {
        continue;
    }
    if(is_dir($entry))
    {
        echo "Directory:$entry<br />";
    }
}

我唯一的问题是第二个“if”语句没有输出结果

echo "Directory:$entry<br />";

即使该条目是一个目录。我已经使用“var_dump”函数手动检查了该条目,它作为目录返回 true。

任何建议都会有所帮助

【问题讨论】:

    标签: php directory


    【解决方案1】:

    试试这个并检查。试一试...

    $handle = opendir("files/");
    while(($entry = readdir($handle)) !== false)
    {
        if($entry == "." || $entry == "..")
        {
            continue;
        }
        elseif(is_dir("files/".$entry))
        {
            echo "Directory:$entry<br />";
        }
    }
    

    【讨论】:

    • 有效。但我仍在试图弄清楚为什么需要这样的逻辑。
    • Becoz is_dir 是相对的。 :) 您在files/ 中有目录。 :) 简单的逻辑。
    【解决方案2】:

    $entry 是相对的... is_dir 需要一个绝对路径。

    【讨论】:

    • 您的答案有效。但是在手册中没有提到它需要绝对路径。它只声明,“文件的路径。如果文件名是相对文件名,它将相对于当前工作目录进行检查。”我像这样手动检查值:var_dump(is_dir($entry)),它返回 true。
    • chdir() 函数将更改 PHP 中的当前目录。否则它不会被 readdir 改变。
    【解决方案3】:

    试试:

    if(is_dir("files/".$entry))
    

    readdir() 只是返回文件名。因此,您的代码会在当前目录而不是子目录中查找文件。

    【讨论】:

    • 但手册指出,如果文件名是目录(通过 is_dir),它应该返回 true。
    • 问题是文件名错误。您关心的文件名是files/foo,但$entry 只包含foo
    • 我想我现在明白了。这是因为我使用的是 opendir 函数,它返回句柄而不是文件名。
    【解决方案4】:

    这只会探测任何目录条目的基本名称:

     is_dir($entry)
    

    opendir() 结果列表将与您提供的用于阅读的目录相关。所以你需要使用:

     is_dir("files/$entry")
    

    【讨论】:

      【解决方案5】:

      您的问题是在elseif(is_dir($entry)) { 中,entry 等于“file.txt”或“somedirectory”之类的字符串,它根本不是指向文件的路径。它需要是“files/file.txt”。

      试试这个:

      $dir = "files/";
      $handle = opendir($dir);
      while(($entry = readdir($handle)) !== false)
      {
          if($entry == "." || $entry == "..")
          {
              continue;
          }
          if(is_dir($dir.$entry))
          {
              echo "Directory:$entry<br />";
          }
      }
      

      【讨论】:

        【解决方案6】:

        尝试使用DirectoryIterator

        $iterator = new \DirectoryIterator(realpath('files/'));
        
        foreach($iterator as $file){
        
          if($file->isDot())
            continue;
        
          if($file->isDir())
            printf('Directory: %s <br/>', $file->getRealPath());
        
        }
        

        【讨论】:

          猜你喜欢
          • 2017-07-31
          • 1970-01-01
          • 2018-07-07
          • 1970-01-01
          • 2014-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多