Вопрос по php – Получить файлы внутри каталога

47

Как получить имена файлов внутри каталога с помощью PHP?

Я не смог найти соответствующую команду с помощью Google, поэтому я надеюсь, что этот вопрос поможет тем, кто задает аналогичные вопросы.

это дубликат стольких вопросов здесь. SilentGhost

Ваш Ответ

3   ответа
0

<?php
    $path = realpath('.'); // put in your path here
    $dir_handle = @opendir($path) or die("Unable to open $path");
    $directories = array();
    while ($file = readdir($dir_handle)) 
        $directories[] = $file;
    closedir($dir_handle);
?>

Как уже упоминалось, итератор каталогов может быть лучшим способом для PHP 5.

76

scandir ноDirectoryIterator это, наверное, лучший способ.

Там такжеreaddir (для использования сopendir) а такжеglob.

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

DirectoryIterator usage: (recommended)
foreach (new DirectoryIterator('.') as $file) {
    if($file->isDot()) continue;
    print $file->getFilename() . '<br>';
}
scandir usage:
$files = scandir('.');
foreach($files as $file) {
    if($file == '.' || $file == '..') continue;
    print $file . '<br>';
}
opendir and readdir usage:
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if($file == '.' || $file == '..') continue;
        print $file . '<br>';
    }
    closedir($handle);
}
glob usage:
foreach (glob("*") as $file) {
    if($file == '.' || $file == '..') continue;
    print $file . '<br>';
}

Как уже упоминалось в комментариях,glob хорошо, потому что звездочку, которую я там использовал, можно использовать для сопоставления файлов, поэтомуglob('*.txt') бы получить все текстовые файлы в папке иglob('image_*') получит все файлы, которые начинаются с image_

@Lando: интересная ссылка. Я ненавижу, когда модератор здесь, на SO, удаляет старые вопросы, которые очень полезны, и уже невозможно их задать.
Одним из преимуществ glob является то, что вы можете легко фильтровать файлы, напримерglob('*.txt') перечислит все текстовые файлы.
@EvilChookie: Единственное, о чем я могу думать, это то, что glob и scandir автоматически загружают всю файловую структуру в память, о чем вы должны знать. Не уверен ни в чем другом.
@Marco: предоставленная вами ссылка больше не работает. Я нашелbenchmark at phparch.com на случай, если кто-то заинтересован.
Есть ли проблема производительности с любым из этих методов?
7

Ответ Паоло Бергантино было хорошо, но сейчас устарело!
рассмотрите следующие официальные способы получить файлы в каталоге.

FilesystemIterator

FilesystemIterator имеет много новых функций по сравнению с его предкомDirectoryIterator как, например, возможность избежать заявленияif($file->isDot()) continue;, Смотрите также вопросРазница междуDirectoryIterator and FilesystemIterator.

$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
    echo $fileinfo->getFilename() , PHP_EOL;
}
RecursiveDirectoryIterator

В этом фрагменте перечислены файлы PHP во всех подкаталогах.

$dir   = new RecursiveDirectoryIterator(__DIR__);
$flat  = new RecursiveIteratorIterator($dir);
$files = new RegexIterator($flat, '/\.php$/i');
foreach($files as $file) {
    echo $file , PHP_EOL;
}

Смотрите такжеWrikken's answer.

Похожие вопросы