目录递归导致无限循环

时间:2014-12-14 10:54:53

标签: php recursion directory subdirectory

我正在尝试递归地读取目录并在其中找到匹配的文件:

function readFiles($sBaseDir)
{
    $pointer = opendir($sBaseDir);
    while (false !== ($sFilePath = readdir($pointer)))
    {
        if (is_dir($sFilePath))
        {
            closedir($pointer);
            readFiles($sFilePath);
        }

        else
        {
            $arPaths = explode(DIRECTORY_SEPARATOR, $sFilePath);
            $sFileName = $arPaths[count($arPaths) - 1];

            $sEnding = substr($sFileName, strpos($sFileName, '.'));
            if ($sEnding === '.rpm' || $sEnding === '.deb' || $sEnding === '.tar.gz' || $sEnding === '.tazpkg')
            {
                echo '<a href="index.php?getfile=' . urlencode($sFilePath) . '">' . $sFileName . '</a><br />' . PHP_EOL;
            }
        }
    }
}

readFiles(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'download');

但是在第一次迭代之后,它的下一次迭代总是.。因此,脚本始终搜索同一目录,但尚未完成。但我想知道为什么,它应该工作,不应该吗?

1 个答案:

答案 0 :(得分:0)

readdir不返回完整路径名,只返回目录中的名称。您需要在其前面添加基目录。并且不需要拆分名称,因为它不包含任何目录分隔符。您还应检查...并跳过它们以防止无限递归。最后,你不应该在循环中间调用closedir(),因为这会阻止进一步的迭代;在while循环结束时执行此操作。

function readFiles($sBaseDir)
{
    $pointer = opendir($sBaseDir);
    while (false !== ($sFilePath = readdir($pointer)))
    {
        if ($sFilePath == '.' || $sFilePath == '..') {
            continue; // Skip . and .. to prevent infinite looping
        }
        $fullPath = $sBaseDir . DIRECTORY_SEPARATOR . $sFilePath;
        if (is_dir($fullPath))
        {
            readFiles($fullPath);
        }

        else
        {
            $sEnding = substr($sFilePath, strpos($sFilePath, '.'));
            if ($sEnding === '.rpm' || $sEnding === '.deb' || $sEnding === '.tar.gz' || $sEnding === '.tazpkg')
            {
                echo '<a href="index.php?getfile=' . urlencode($fullPath) . '">' . $sFileName . '</a><br />' . PHP_EOL;
            }
        }
    }
    closedir($pointer);
}