PHP: Получение списка файлов и папок в каталоге / поиск файлов по типам

Сегодня я приведу пример функции, которая позволяет получить список файлов и папок внутри каталога.
При разработке ПО очень часто нужно работать с файловой системой. Как правило нужно получать список файлов (или папок) в определенной папке. В свое время я написал небольшую функцию, которая позволяет решать данную задачу. Со временем функция немного модернизировалась, чтобы охватить как можно больший список подзадач, которые могут возникнуть при решении основной задачи получения списка файлов в каталоге на языке программирования PHP.
Что умеет делать функция:
1) Искать файлы в каталоге
2) Искать папки в каталоге
3) Искать файлы и папки по префиксу
4) Искать файлы по расширению
5) Искать файлы исключая расширение
6) Искать во вложенных папках

Код функции:

function fsDirectoryInfo($path, $searchFile = true, $searchDir = true, $prefix = array(), $fileFormats = array(), $topDirectory = true)
{
    if($path === '' || $path[strlen($path) - 1] !== '/') $path .= '/';
    $arr = array('LENGTH' => 0, 'NAMES' => array());
    if (!is_dir($path) || ($searchDir === false && $searchFile === false)) {
      return $arr;
    }
    $dh = opendir($path);
    $fileFormatsCount = count($fileFormats);
    $checkPrefix = is_array($prefix) && count($prefix) > 0;
    while(false !== ($dir = readdir($dh))) {
      if ($dir == '.' || $dir == '..') {
        continue;
      }
      $fileName = $path.$dir;
      if($checkPrefix) {
        $next = true;
        foreach($prefix as $p) {
          if(($p[0] !== '!' && strpos($dir, $p) === 0) 
            || ($p[0] === '!' && strpos($dir, substr($p, 1)) !== 0)) {
            $next = false;
            break;
          }
        }
        if($next) {
            continue;
        }
      }
      if ($searchFile && is_file($fileName)) {
        $ext = pathinfo($fileName, PATHINFO_EXTENSION);
        if ($fileFormatsCount > 0 
           && (in_array('!'.$ext, $fileFormats) || !in_array($ext, $fileFormats))) {
          continue;
        }
        $arr['NAMES'][] = $dir;
        ++$arr['LENGTH'];
      } 

      if(is_dir($fileName)) {
        if($searchDir) {
            $arr['NAMES'][] = $dir;
            ++$arr['LENGTH'];
        }
        if(!$topDirectory) {
            $temp = fsDirectoryInfo($fileName, $searchFile, $searchDir, $prefix, $fileFormats, $topDirectory);
            $arr['LENGTH'] += $temp['LENGTH'];
            for($i = 0; $i < $temp['LENGTH']; ++$i) {
                $arr['NAMES'][] = $dir.'/'.$temp['NAMES'][$i];
            }
        }
      }
   }
   closedir($dh); 
   return $arr;
}

Пример использования:
Поиск файлов в папке 'folder/path/' (включая вложенные каталоги). Имя файла должно начинаться с order и файл должен быть формата doc или docx

$result = fsDirectoryInfo('folder/path/', true, false, array('order'), array('doc', 'docx'), false);

Примечание: если необходимо исключить определенные форматы файлов из поиска, то перед форматом необходимо добавить символ '!' (например '!docx')

Запись опубликована в рубрике PHP с метками , , , , , , , , . Добавьте в закладки постоянную ссылку.