Поиск файла в папке и всех подпапках. Пример рекурсии 2

Поиск файла в папке и всех подпапках. Пример рекурсии 2В этой статье я покажу пример использования рекурсии. Для наглядности примера, переберем все файлы папки и подпапок. Перебирать файлы и подпапки будем рекурсивно. Чтобы было более наглядно, будем искать файл по имени. В случае нахождения файла выведем путь до файла.

Ниже приведен подробно прокомментированный код:

/**
* Поиск файла по имени во всех папках и подпапках
* 
* @param string $folderName - пусть до папки
* @param string $fileName - искомый файл
*/
function search_file($folderName, $fileName){
    // открываем текущую папку 
    $dir = opendir($folderName); 
    // перебираем папку 
    while (($file = readdir($dir)) !== false){ // перебираем пока есть файлы
        if($file != "." && $file != ".."){ // если это не папка
            if(is_file($folderName."/".$file)){ // если файл проверяем имя
                // если имя файла нужное, то вернем путь до него
                if($file == $fileName) return $folderName."/".$file;
            } 
            // если папка, то рекурсивно вызываем search_file
            if(is_dir($folderName."/".$file)) return search_file($folderName."/".$file, $fileName);
        } 
    }
    // закрываем папку
    closedir($dir);
}

Пример вызова функции

// пример использования
$folderName = "./files"; // в какой папке ищем
$fileName = "test.txt"; // что ищем
$result = search_file($folderName, $fileName);
if($result){
    echo $result;
}else{
    echo "Нет такого файла";
}
Рассказать друзьям:


Поиск файла в папке и всех подпапках. Пример рекурсии 2: 5 комментариев

    1. Нет, не лишний, там в разных случаях return по разному работает. В первом случае, возвращается путь до найденного файла, а во втором случае рекурсивно вызывается сама функция.

      1. Это я знаю, просто ключевое слово «return» прерывает выполнение функции как только найдет первую папку, а если у меня картинка в другой вложеной папке то обходит, то есть как только нашли первую папку — функция «прыгает» в неё и там ищет файл без последующего перебора остальных папок в корне.

  1. Мне по душе итераторы в данном случае. Посудите сами:
    $iterator = new RecursiveDirectoryIterator("/folder");
    foreach (new RecursiveIteratorIterator($iterator) as $file) {
    if ($file->isDot()) {
    continue;
    } if ($file->isDir()) {
    // это папка
    } if ($file->isFile()) {
    // это файл
    }
    }

    Удобней ведь?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*