2009-12-07 6 views
22

Я пытаюсь вернуть файлы в указанном каталоге, используя рекурсивный поиск. Я успешно достиг этого, однако хочу добавить несколько строк кода, которые позволят мне указать определенные расширения, которые я хочу вернуть.Рекурсивный поиск файлов (PHP)

Например, верните только .jpg файлы в каталог.

Вот мой код,

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
echo $file . "<br/> \n"; 
} 
?> 

пожалуйста, дайте мне знать, что я могу добавить к выше код для достижения этой цели, благодаря

ответ

29
<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$display = Array ('jpeg', 'jpg'); 
foreach(new RecursiveIteratorIterator($it) as $file) 
{ 
    if (in_array(strtolower(array_pop(explode('.', $file))), $display)) 
     echo $file . "<br/> \n"; 
} 
?> 
6

Попробуйте это, он использует массив разрешенных типов файлов и только echos из файла, если расширение файла существует в массиве.

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$allowed=array("pdf","txt"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) { 
     echo $file . "<br/> \n"; 
    } 
} 
?> 

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

20

Вы должны создать фильтр:

class JpegOnlyFilter extends RecursiveFilterIterator 
{ 
    public function __construct($iterator) 
    { 
     parent::__construct($iterator); 
    } 

    public function accept() 
    { 
     return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename()); 
    } 

    public function __toString() 
    { 
     return $this->current()->getFilename(); 
    } 
} 

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$it = new JpegOnlyFilter($it); 
$it = new RecursiveIteratorIterator($it); 

foreach ($it as $file) 
    ... 
+1

Это не будет работать, если вы остановитесь, когда нашел каталог (если -> ISFILE()) итератор не глубоко в этом каталоге для сканирования нескольких файлов и каталогов, является более сложный, чем однострочный if. – Tecnocat

1

Вы можете проверить эту страницу об использовании Glob() для поиска похожих:

http://www.electrictoolbox.com/php-glob-find-files/

+0

Ваш источник хороший, но попробуйте дать конструктивный ответ на примере, как ресурс может быть использован для конкретного случая и только добавьте ссылку в качестве ссылки. –

+0

Я не думаю, что glob обрабатывает рекурсию, которая была частью вопроса. – Oded

3

Пусть PHP сделать работу:

$directory = new RecursiveDirectoryIterator('path/to/directory/'); 
$iterator = new RecursiveIteratorIterator($directory); 
$regex  = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH); 

echo '<pre>'; 
print_r($regex); 
1

Что касается верхнего голосуемого ответа: я создал этот код, который использует несколько er, только 3, isset(), array_flip(), explode() вместо 4 функций. Я протестировал главный голосовой ответ, и он был медленнее моего. Я предлагаю дать руднику попробовать:

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    $FILE = array_flip(explode('.', $file)); 
    if (isset($FILE['php']) || isset($FILE['jpg'])) { 
     echo $file. "<br />"; 
    } 
}