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