- Поиск файла в папке и подпапках на PHP
- Поиск файлов в PHP
- Поиск в директории
- Список всех файлов и директорий
- Результат:
- Только файлы
- Результат:
- Только директории
- Результат:
- Поиск по расширению
- Результат:
- Поиск по нескольким расширениям
- Результат:
- Поиск по имени файла
- Результат:
- Результат:
- Поиск в дереве
- Список всех файлов
- Результат:
- Список всех директорий
- Результат:
- Поиск по имени/расширению
- Результат:
- Простой поиск файлов по названию и расширению на PHP
- Два варианта поиска файлов по названию на PHP
- Поиск файлов по расширению на PHP
Поиск файла в папке и подпапках на PHP
Хорошим примером использования рекурсии, может послужить поиск файла в папке и всем вложенным подпапкам.
Для поиска файла, достаточно перебрать все файлы во всех папках и сравнить название файла с искомым. И в случае совпадения добавить путь до файла в массив найденных фалов.
$folderName = ABSPATH; // в какой папке ищем $fileName = "xml"; // что ищем $found = search_file( $folderName, $fileName ); print_r( $found ); /* Вернет: Array ( [0] => /home/example.com/xmlrpc.php [1] => /home/example.com/wp-includes/class-wp-xmlrpc-server.php [2] => /home/example.com/wp-includes/wlwmanifest.xml ) */ /** * Поиск файла по имени во всех папках и подпапках * @param string $folderName - пусть до папки * @param string $fileName - искомый файл * @return array Массив найденных файлов. */ function search_file( $folderName, $fileName ) < $found = array(); $folderName = rtrim( $folderName, '/' ); $dir = opendir( $folderName ); // открываем текущую папку // перебираем папку, пока есть файлы while( ($file = readdir($dir)) !== false )< $file_path = "$folderName/$file"; if( $file == '.' || $file == '..' ) continue; // это файл проверяем имя if( is_file($file_path) )< // если имя файла искомое, то вернем путь до него if( false !== strpos($file, $fileName) ) $found[] = $file_path; >// это папка, то рекурсивно вызываем search_file elseif( is_dir($file_path) ) < $res = search_file( $file_path, $fileName ); $found = array_merge( $found, $res ); >> closedir($dir); // закрываем папку return $found; >
Поиск файлов в PHP
Для поиска файлов на сервере хорошо подходит функция glob(), которая возвращает список файлов по заданной маске, например:
В маске можно использовать следующие специальные символы:
* | Соответствует нулю или большему количеству любых символов. |
? | Один любой символ. |
[. ] | Один символ входящий в группу. |
[. ] | Один символ не входящий в группу. |
Вхождение подстрок, работает с флагом GLOB_BRACE . | |
\ | Экранирует следующий символ, кроме случаев, когда используется флаг GLOB_NOESCAPE . |
GLOB_MARK | Добавляет слеш к каждой возвращаемой директории. |
GLOB_NOSORT | Возвращает файлы в том виде, в котором они содержатся в директории (без сортировки). Если этот флаг не указан, то имена сортируются по алфавиту. |
GLOB_NOCHECK | Возвращает шаблон поиска, если с его помощью не был найден ни один файл. |
GLOB_NOESCAPE | Обратные слеши не экранируют метасимволы. |
GLOB_BRACE | Раскрывает для совпадения с « a », « b » или « c ». |
GLOB_ONLYDIR | Возвращает только директории, совпадающие с шаблоном. |
GLOB_ERR | Останавливается при ошибках чтения (например, директории без права чтения), по умолчанию ошибки игнорируются. |
Возможно использовать несколько флагов:
$files = glob('/tmp/*.jpg', GLOB_NOSORT|GLOB_ERR);
Далее во всех примерах используется папка tmp со следующим содержимым:
Поиск в директории
Список всех файлов и директорий
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/*') as $file) < $files[] = basename($file); >print_r($files);
Результат:
Array ( [0] => 1.svg [1] => 2.jpg [2] => 22-f.gif [3] => 22.svg [4] => img.png [5] => path [6] => prod.png [7] => style-1.txt [8] => style-2.css )
Только файлы
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/*') as $file) < if (is_file($file)) < $files[] = basename($file); >> print_r($files);
Результат:
Array ( [0] => 1.svg [1] => 2.jpg [2] => 22-f.gif [3] => 22.svg [4] => img.png [5] => prod.png [6] => style-1.txt [7] => style-2.css )
Только директории
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/*') as $file) < if (is_dir($file)) < $files[] = basename($file); >> print_r($files);
Результат:
Поиск по расширению
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/*.svg') as $file) < $files[] = basename($file); >print_r($files);
Результат:
Поиск по нескольким расширениям
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/*.', GLOB_BRACE) as $file) < $files[] = basename($file); >print_r($files);
Результат:
Array ( [0] => 2.jpg [1] => img.png [2] => prod.png )
Поиск по имени файла
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/style*.*') as $file) < $files[] = basename($file); >print_r($files);
Результат:
Array ( [0] => style-1.txt [1] => style-2.css )
$dir = __DIR__ . '/tmp'; $files = array(); foreach(glob($dir . '/1*.*', GLOB_BRACE) as $obj) < $files[] = basename($obj); >print_r($files);
Результат:
Array ( [0] => 1.svg [1] => 2.jpg [2] => 22-f.gif [3] => 22.svg )
Поиск в дереве
Список всех файлов
function glob_tree_files($path, $_base_path = null) < if (is_null($_base_path)) < $_base_path = ''; >else < $_base_path .= basename($path) . '/'; >$out = array(); foreach(glob($path . '/*') as $file) < if (is_dir($file)) < $out = array_merge($out, glob_tree_files($file, $_base_path)); >else < $out[] = $_base_path . basename($file); >> return $out; > $dir = __DIR__ . '/tmp'; $files = glob_tree_files($dir); print_r($files);
Результат:
Array ( [0] => 1.svg [1] => 2.jpg [2] => 22-f.gif [3] => 22.svg [4] => img.png [5] => path/icon-rew.png [6] => path/marker.png [7] => path/psd/1.psd [8] => path/psd/2.psd [9] => path/psd/index.psd [10] => path/sh-1.png [11] => path/title-1.png [12] => prod.png [13] => style-1.txt [14] => style-2.css )
Список всех директорий
function glob_tree_dirs($path, $_base_path = null) < if (is_null($_base_path)) < $_base_path = ''; >else < $_base_path .= basename($path) . '/'; >$out = array(); foreach(glob($path . '/*', GLOB_ONLYDIR) as $file) < if (is_dir($file)) < $out[] = $_base_path . basename($file); $out = array_merge($out, glob_tree_dirs($file, $_base_path)); >> return $out; > $dir = __DIR__ . '/tmp'; $files = glob_tree_dirs($dir); print_r($files);
Результат:
Array ( [0] => path [1] => path/psd )
Поиск по имени/расширению
function glob_tree_search($path, $pattern, $_base_path = null) < if (is_null($_base_path)) < $_base_path = ''; >else < $_base_path .= basename($path) . '/'; >$out = array(); foreach(glob($path . '/' . $pattern, GLOB_BRACE) as $file) < $out[] = $_base_path . basename($file); >foreach(glob($path . '/*', GLOB_ONLYDIR) as $file) < $out = array_merge($out, glob_tree_search($file, $pattern, $_base_path)); >return $out; > $path = __DIR__ . '/tmp'; $files = glob_tree_search($path, '*.'); print_r($files);
Результат:
Array ( [0] => 2.jpg [1] => img.png [2] => prod.png [3] => path/icon-rew.png [4] => path/marker.png [5] => path/sh-1.png [6] => path/title-1.png )
Чтобы в результирующих списках выводились полные пути к файлам, достаточно удалить функцию basename() .
Простой поиск файлов по названию и расширению на PHP
Привет, друзья! Довелось мне поработать на одном коммерческом сайте. И, как выяснилось, с течением недолгого времени на сайте пропала часть изображений. Удалять их, конечно же, никто не удалял, и предположения были, что папку случайно перенесли в другое место.
Да, бывает и такое. Но суть сейчас не в этом. А в том, как я искал эту папку. Поскольку мне были известны имена некоторых файлов (а это уже хорошая зацепка при поиске), то я решил написать небольшой скрипт для поиска этих файлов по всему сайту. Вдобавок ко всему специально для аудитории сайта я доработал поиск и сделал несколько разных его вариантов.
Два варианта поиска файлов по названию на PHP
В этом блоке я представляю вашему вниманию два разных варианта поиска файлов на вашем хостинге по названию.
1. Точный поиск по названию:
getfileName(), 0, strrpos($info->getfileName(), ".")); $name_search = array("robots", "www_pandoge_com"); // Список файлов foreach($name_search as $key_name) { if($name_file == $key_name) { echo $info->getPathname()."
"; > > > ?>
2. Неточный поиск (по наличию слова в названии):
getfileName(), 0, strrpos($info->getfileName(), ".")); $name_search = array("robots", "www_pandoge_com"); // Список файлов foreach($name_search as $key_name) { if(preg_match("/".$key_name."/", $name_file)) { echo $info->getPathname()."
"; > > > ?>
Во всех вариантах – переменная $name_search содержит в себе слово (слова) для вашего поиска по файлам.
Код вы вставляете в файл PHP с любым именем, после чего грузите его на ваш хостинг.
Обращаетесь к нему на вашем сайте, и на выходе (при положительном результате) вы получите список найденных файлов с полным их местоположением.
Поиск файлов по расширению на PHP
В поисках файлов по расширению, как вы поняли, не учитывается имя, а учитывается его формат. Например, у изображений это может быть PNG, JPG или GIF, а у аудиофайлов – MP3, WAVE и другие.
getfileName(), strrpos($info->getfileName(), ".") + 1); $name_search = array("mp3", "jpg"); // Список форматов foreach($name_search as $key_name) { if($file_formal == $key_name) { echo $info->getPathname()."
"; > > > ?>
Его вы также вставляете в PHP-файл, грузите на хостинг и обращаетесь для получения результатов поиска.
Обратите внимание, что регистр во всех вариантах имеет значение. И, например, если файл на хостинге имеет расширение MP3, а в переменной для поиска вы указали «mp3» – файлы найдены не будут. Но этот момент можно подправить с помощью функции «mb_strtolower».