рекурсия каталога вызывает бесконечный цикл

Я пытаюсь рекурсивно прочитать каталог и найти в нем подходящие файлы:

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

Но после первой итерации следующая итерация всегда ., Таким образом, скрипт всегда ищет один и тот же каталог и пока не может быть завершен. Но мне интересно, почему, это должно работать, не так ли?

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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]