Reputation: 1362
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?
Upvotes: 0
Views: 690
Reputation: 781058
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);
}
Upvotes: 1