我正在尝试递归地读取目录并在其中找到匹配的文件:
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 :(得分: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);
}