
Рекурсивный обход каталогов на PHP
Понадобилась универсальная функция для рекурсивного сканирования выбранного каталога, но не просто так, а с обработчиком найденных файлов. Вот что у меня получилось:Code (PHP) : Убрать нумерацию
- //--------------------------------------------------------------
- // Функция рекурсивного сканирования каталога
- //--------------------------------------------------------------
- // Параметры:
- // $directory - начальный каталог
- // $callback - функция для обработки найденных файлов
- //--------------------------------------------------------------
- function scan_recursive($directory, $callback=null) {
- // Привести каталог в канонизированный абсолютный путь
- $directory=realpath($directory);
- if ($d=opendir($directory)) {
- while($fname=readdir($d)) {
- if ($fname=='.' || $fname=='..') {
- continue;
- }
- else {
- // Передать путь файла в callback-функцию
- if ($callback!=null && is_callable($callback)) {
- $callback($directory.DIRECTORY_SEPARATOR.$fname);
- }
- }
- if (is_dir($directory.DIRECTORY_SEPARATOR.$fname)) {
- scan_recursive($directory.DIRECTORY_SEPARATOR.$fname, $callback);
- }
- }
- closedir($d);
- }
- }
Code (PHP) : Убрать нумерацию
- // Callback-функция, которая будет принимать имена файлов
- function scan_callback($fname) {
- echo $fname.'<br/>';
- }
- // Вывести список файлов и каталогов
- scan_recursive('C:/some_dir\subfolder/', 'scan_callback');
Просмотров: 7436 | Комментариев: 6
Метки: PHP, полезные функции

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье

ManHunter
(20.06.2021 в 14:39):
И в чем его преимущество? callback может не только выводить строку на экран. Низачот.

Упрощенный вариант
(20.06.2021 в 14:33):
function listing($dir){
$dirCanonical=realpath($dir);
if($fileOrDir=opendir($dirCanonical)){
while($fileName=readdir($fileOrDir)){
if($fileName=="."||$fileName==".."){
continue;
}
$callBack=$dirCanonical.DIRECTORY_SEPARATOR.$fileName;
echo $callBack,"<br>";
if(is_dir($callBack)){
listing($callBack);
}
}
}
}
$dirCanonical=realpath($dir);
if($fileOrDir=opendir($dirCanonical)){
while($fileName=readdir($fileOrDir)){
if($fileName=="."||$fileName==".."){
continue;
}
$callBack=$dirCanonical.DIRECTORY_SEPARATOR.$fileName;
echo $callBack,"<br>";
if(is_dir($callBack)){
listing($callBack);
}
}
}
}

Дима
(18.10.2019 в 15:00):
спасибо, функция помогла!!

Александр
(08.04.2018 в 08:06):
Большое спасибо!:)

Владислав
(17.07.2017 в 15:42):
Спасибо!

Добавить комментарий
Заполните форму для добавления комментария

В мануале к функции readdir на php net есть пример и объяснение - любой элемент каталога, чьё имя может быть преобразовано к false, остановит цикл while (например, элемент с именем "0").
Функция readdir может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Например, в "упрощённом примере" строку
while($fileName=readdir($fileOrDir)){
надо заменить на
while(false !== ($fileName=readdir($fileOrDir))){