PHP readdir () возвращает записи "." И ".." - PullRequest
3 голосов
/ 06 октября 2009

Я пишу простую систему веб-отчетов для моей компании. Я написал скрипт для index.php, который получает список файлов в каталоге «reports» и автоматически создает ссылку на этот отчет. Это работает нормально, но моя проблема здесь в том, что readdir () продолжает возвращать. и .. указатели каталога в дополнение к содержимому каталога. Есть ли какой-нибудь способ предотвратить это ДРУГОЕ, ЧЕМ зацикливание возвращаемого массива и удаление их вручную?

Вот соответствующий код для любопытных:

//Open the "reports" directory
$reportDir = opendir('reports');

//Loop through each file
while (false !== ($report = readdir($reportDir)))
{
  //Convert the filename to a proper title format
  $reportTitle = str_replace(array('_', '.php'), array(' ', ''), $report);
  $reportTitle = strtolower($reportTitle);
  $reportTitle = ucwords($reportTitle);

  //Output link
  echo "<a href=\"viewreport.php?" . $report . "\">$reportTitle</a><br />";
}

//Close the directory
closedir($reportDir);

Ответы [ 5 ]

15 голосов
/ 06 октября 2009

В приведенном выше коде вы можете добавить первую строку в цикле while:

if ($report == '.' or $report == '..') continue;
4 голосов
/ 06 октября 2009
array_diff(scandir($reportDir), array('.', '..'))

или даже лучше:

foreach(glob($dir.'*.php') as $file) {
    # do your thing
}
2 голосов
/ 06 октября 2009

Нет, эти файлы принадлежат каталогу, поэтому readdir должен их вернуть. Я бы посчитал, что любое другое поведение нарушено.

В любом случае, просто пропустите их:

while (false !== ($report = readdir($reportDir)))
{
  if (($report == ".") || ($report == ".."))
  {
     continue;
  }
  ...
}
1 голос
/ 06 октября 2009

Я бы не знал другого пути, как "." и ".." также являются правильными каталогами. Так как вы все равно делаете цикл для формирования правильного URL отчета, вы можете просто вставить немного if, которое игнорирует . и .. для дальнейшей обработки.

EDIT
Пол Ламмерцма был немного быстрее меня. Это решение, которое вы хотите; -)

0 голосов
/ 16 апреля 2019

Я хотел проверить на "." и каталоги "..", а также любые файлы, которые могут быть недействительными в зависимости от того, что я хранил в каталоге, поэтому я использовал:

while (false !== ($report = readdir($reportDir)))
{
    if (strlen($report) < 8) continue;
    // do processing
}
...