Сегодня я приведу пример функции, которая позволяет получить список файлов и папок внутри каталога.
При разработке ПО очень часто нужно работать с файловой системой. Как правило нужно получать список файлов (или папок) в определенной папке. В свое время я написал небольшую функцию, которая позволяет решать данную задачу. Со временем функция немного модернизировалась, чтобы охватить как можно больший список подзадач, которые могут возникнуть при решении основной задачи получения списка файлов в каталоге на языке программирования 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')