Blog. Just Blog

Рекурсивный обход каталогов на PHP

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Понадобилась универсальная функция для рекурсивного сканирования выбранного каталога, но не просто так, а с обработчиком найденных файлов. Вот что у меня получилось:
  1. //--------------------------------------------------------------
  2. // Функция рекурсивного сканирования каталога
  3. //--------------------------------------------------------------
  4. // Параметры:
  5. //   $directory - начальный каталог
  6. //   $callback - функция для обработки найденных файлов
  7. //--------------------------------------------------------------
  8. function scan_recursive($directory$callback=null) {
  9.     // Привести каталог в канонизированный абсолютный путь
  10.     $directory=realpath($directory);
  11.  
  12.     if ($d=opendir($directory)) {
  13.         while($fname=readdir($d)) {
  14.             if ($fname=='.' || $fname=='..') {
  15.                 continue;
  16.             }
  17.             else {
  18.                 // Передать путь файла в callback-функцию
  19.                 if ($callback!=null && is_callable($callback)) {
  20.                     $callback($directory.DIRECTORY_SEPARATOR.$fname);
  21.                 }
  22.             }
  23.  
  24.             if (is_dir($directory.DIRECTORY_SEPARATOR.$fname)) {
  25.                 scan_recursive($directory.DIRECTORY_SEPARATOR.$fname$callback);
  26.             }
  27.         }
  28.         closedir($d);
  29.     }
  30. }
Пример вызова функции:
  1. // Callback-функция, которая будет принимать имена файлов
  2. function scan_callback($fname) {
  3.     echo $fname.'<br/>';
  4. }
  5.  
  6. // Вывести список файлов и каталогов
  7. scan_recursive('C:/some_dir\subfolder/''scan_callback');
В этом случае будет просто выведен список файлов и вложенных каталогов с содержимым, находящихся по указанному пути. Функцию можно доработать, например, добавив возможность остановки сканирования при получении какого-нибудь ответа из callback-функции. Но пока такой задачи не возникало.

Поделиться ссылкой ВКонтакте
Просмотров: 6567 | Комментариев: 6

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

Комментарии

Отзывы посетителей сайта о статье
Николай Терех (31.01.2022 в 15:51):
Коллеги, в представленных исходниках баг.

В мануале к функции readdir на php net есть пример и объяснение - любой элемент каталога, чьё имя может быть преобразовано к false, остановит цикл while (например, элемент с именем "0").

Функция readdir может возвращать как логическое значение false, так и значение не типа boolean, которое приводится к false. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Например, в "упрощённом примере" строку
while($fileName=readdir($fileOrDir)){
надо заменить на
while(false !== ($fileName=readdir($fileOrDir))){
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);
            }
        }
    }
}
Дима (18.10.2019 в 15:00):
спасибо, функция помогла!!
Александр (08.04.2018 в 08:06):
Большое спасибо!:)
Владислав (17.07.2017 в 15:42):
Спасибо!

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

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.3 сек. / MySQL: 2 (0.0118 сек.) / Память: 4.5 Mb
Наверх