Я пытаюсь рекурсивно прочитать каталог и найти в нем подходящие файлы:
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');
Но после первой итерации следующая итерация всегда .
, Таким образом, скрипт всегда ищет один и тот же каталог и пока не может быть завершен. Но мне интересно, почему, это должно работать, не так ли?
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);
}
Других решений пока нет …