douguazhi5966 2014-12-14 10:54
浏览 83
已采纳

目录递归导致无限循环

I am trying to read a directory recursively and find the matching files in it:

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');

But after the first iteration it´s next iteration is always .. So, the script always searches the same directory and could not be finished, yet. But I am wondering why, it should work, shouldn´t it?

  • 写回答

1条回答 默认 最新

  • dongxian1699 2014-12-14 11:08
    关注

    readdir doesn't return a full pathname, it just returns the name within the directory. You need to prepend the base directory to it. And there's no need to split the name, since it won't contain any directory separators. You should also check for . and .. and skip them to prevent infinite recursion. Finally, you shouldn't call closedir() in the middle of the loop, as that will prevent further iterations; do that at the end of the while loop.

    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);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭