Как на PHP получить список каталогов и файлов

scandir ~ [ wwweb.uz ]

Примите на вооружение рабочий пример для получения списка папок, подпапок и файлов, средствами языка PHP.

Как это обычно бывает, решение приходит от поставленной задачи.
Выполняя анализ состояния сайта заказчика, задался целью получить список корневых и вложенных директорий, а также содержимое этих директорий (то бишь файлов), для того, чтобы найти файлы (в моем случае — картинки), у который размер равен нулю.

Первый метод, это рекурсивная выборка.

function listFolderFiles($dir){
    $ffs = scandir($dir);
    echo '<ol>';
    foreach($ffs as $ff){
        if($ff != '.' && $ff != '..'){
            echo '<li>'.$ff;

            if(is_dir($dir.'/'.$ff)) {
                listFolderFiles($dir.'/'.$ff);
            }
            echo '</li>';
        }
    }
    echo '</ol>';
}

$dir = 'путь к исходной директории'; // напр. /home/folder/subfolder
listFolderFiles($dir);

Второй метод, который мне как раз и пригодился, это тот же вывод папок, подпапок и файлов, но с проверкой размера файлов.

$pathLen = 0;

function prePad($level)
{
  $ss = "";

  for ($ii = 0;  $ii < $level;  $ii++)
  {
    $ss = $ss . "|  ";
  }

  return $ss;
}

function myScanDir($dir, $level, $rootLen)
{
  global $pathLen;

  global $normFileSize;
  global $nullFileSize;

  if ($handle = opendir($dir)) {

    $allFiles = array();

    while (false !== ($entry = readdir($handle))) {
      if ($entry != "." && $entry != "..") {
        if (is_dir($dir . "/" . $entry))
        {
          $allFiles[] = "D: " . $dir . "/" . $entry;
        }
        else
        {
          $allFiles[] = "F: " . $dir . "/" . $entry;
        }
      }
    }
    closedir($handle);

    natsort($allFiles);

    foreach($allFiles as $value)
    {
      $displayName = substr($value, $rootLen + 4);
      $fileName    = substr($value, 3);
      $linkName    = str_replace("%20", " ", substr($value, $pathLen + 3));
      if (is_dir($fileName)) {
        echo prePad($level) . $linkName . "<br>\n";
        myScanDir($fileName, $level + 1, strlen($fileName));
      } else {

        $nfile = round(filesize('путь до нужного каталога'.$linkName)/1024, 2) ;

		// если нужно сделать файл кликабельным
        //echo prePad($level) . "<a href=\" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a> [" . $nfile . " kB]<br>\n";
        if($nfile == 0) {
            $nullFileSize += 1;
            echo prePad($level) . "<font color=red>" . $displayName . " [" . $nfile . " kB]</font><br>";
        }
        else {
            $normFileSize += 1;
            echo prePad($level) . $displayName . " [" . $nfile . " kB]<br>";
        }
      }
    }
  }
}

Далее, можно оформить вывод html документом:

<!DOCTYPE HTML>
<html>
<head><meta charset="UTF-8"></head>
<body>
<p style="font-family:verdana; font-size:small;">
<?php
	$root = $cat;
	$pathLen = strlen($root);
	myScanDir($root, 0, strlen($root));

	$sum = $normFileSize + $nullFileSize;
	echo '<hr>Всего файлов: ' . $sum . '<br>';
	echo 'Из них пустых файлов: ' . $nullFileSize . '<br>';
?>
</p>
</body>
</html>

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *