2010-04-30 1 views
46

Есть ли способ написать функцию PHP file_exists, чтобы он искал каталог для файла с произвольным расширением. Например, предположим, что я знал, что файл называется «привет», но я не знал расширения, как бы написать функцию, которая искала файл с именем hello. * И вернула имя этого файла? Насколько я могу судить, file_exists будет искать только строку.PHP file_exists и подстановочный знак

Спасибо.

+1

* (родственный) * http://www.phparch.com/2010/04/28/putting-glob-to-the-test/ – Gordon

ответ

81

Вы ищете функцию glob().

file_exists не делает никакого поиска: он позволяет только знать, существует ли какой-либо флик, когда вы знаете его имя.

И с PHP> = 5.3 вы можете использовать новый GlobIterator.


В качестве примера с glob(), следующей части кода:

$list = glob('temp*.php'); 
var_dump($list); 

дает мне этот выход:

array 
    0 => string 'temp-2.php' (length=10) 
    1 => string 'temp.php' (length=8) 


Хотя это одно:

$list = glob('te*-*'); 
var_dump($list); 

Да, с двумя * ;-)

Даст мне:

array 
    0 => string 'temp-2.php' (length=10) 
    1 => string 'test-1.php' (length=10) 
    2 => string 'test-curl.php' (length=13) 
    3 => string 'test-phing-1' (length=12) 
    4 => string 'test-phpdoc' (length=11) 
+0

+1 избили меня. –

+0

Я знал, что для этого была лучшая функция. Спасибо! – bsamek

+0

Добро пожаловать :-) Удачи! –

4

По PHP5.3, вы можете также использовать GlobIterator для поиска каталога с групповыми символами:

$it = iterator_to_array(
    new GlobIterator('/some/path/*.pdf', GlobIterator::CURRENT_AS_PATHNAME)); 

вернет полные пути ко всем файлам .pdf в некотором/пути в массиве. Вышеописанное выполняет примерно то же, что и glob(), но итераторы предоставляют более мощный и расширяемый API.

1

Если вам нужно немного больше контроля и на pre PHP 5.3 вы можете использовать DirectoryIterator или RecursiveDirectoryIterator. Оба имеют большую функцию для дополнительного управления и манипуляций.

PHP документы находятся на DirectoryIterator и RecursiveDirectoryIterator

3

Пока file_exists возвращает булево я написал эту небольшую функцию , которая принимает строку поиска с * для поиска файлов ... Пример:

searchForFile("temp*"); 

    function searchForFile($fileToSearchFor){ 
     $numberOfFiles = count(glob($fileToSearchFor)); 
     if($numberOfFiles == 0){ return(FALSE); } else { return(TRUE);} 
    } 
+0

Работает как шарм. Замечание: вам может потребоваться добавить часть $ _SERVER ['DOCUMENT_ROOT'] в начало имени файла. –