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

87

По какой-то причине я продолжаю получать 1 для имен файлов с помощью этого кода:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

Когда я повторяю каждый элемент в $ results_array, я получаю кучу единиц, а не имя файла. Как мне узнать названия файлов?

DexterW
источник
1
Есть несколько вариантов использования glob .
продуктовый магазин allnight
возможный дубликат Получить иерархию каталога с PHP
e-sushi
1
Проблема с плакатом заключалась в том, что присваивание имеет очень низкий приоритет, поэтому сначала вычисляется оператор '! ==', а затем двоичный результат этой операции присваивается $ file. Единственное необходимое исправление - использовать ($ file = readdir ($ handle))! == FALSE "
Омн
это работает: halgatewood.com/free-php-list-files-in-a-directory-script
InTheNameOfScience
с 69 голосов до 70. Я чувствую себя противоположностью Хэнка Муди
Чарли

Ответы:

167

Не беспокойтесь о open / readdir и используйте globвместо этого:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}
Тату Улманен
источник
24
Возможно, вы захотите обернуть array_filter(..., 'is_file')этот глобус, так как вопрос требует файлов.
Салате
23
Не все имена файлов имеют форму *.*: просто используйте *вместо этого.
jameshfisher
Как мы можем получить все файлы в списке расширений? Например, если нам нужны все файлы .php и .js?
Ниш
3
Да, это не очень надежный ответ. У файлов не обязательно должны быть расширения, а каталогам можно давать имена something.something. Лучше использовать array_filterи glob($log_directory.'/*').
Эндрю
Я поддержал это, потому что мне просто нужен был простой ответ, и все соответствующие файлы для моего варианта использования были бы *.*. Более здравое выражение сделало бы это еще лучшим ответом.
TecBrat
49

Стиль SPL :

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

Проверьте классы DirectoryIterator и SplFileInfo на предмет списка доступных методов, которые вы можете использовать.

Илия
источник
Отличный способ получить только файлы и их имена вместо всего пути, спасибо!
Крис
1
Да. Для полных путей вы можете использовать getPathname: php.net/manual/en/splfileinfo.getpathname.php
Илия
18

Вам нужно заключить в $file = readdir($handle)круглые скобки.

Ну вот:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}
Майк Мур
источник
14

Поскольку принятый ответ имеет два важных недостатка, я публикую улучшенный ответ для тех новичков, которые ищут правильный ответ:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Фильтрация globeрезультатов функции is_fileнеобходима, потому что она также может возвращать некоторые каталоги.
  2. Не все файлы имеют .в своих именах символы, поэтому */*в целом шаблон - отстой.
Aliweb
источник
Это чистое исполнение, которое у меня сработало. Предыдущие ответы показали каталоги в результатах, которые мне не нужны.
AWP
Вам, сэр, нужно больше голосов! На самом деле (в Windows) мне пришлось использовать, basename($file)чтобы получить только имя файла, а не весь путь с именем файла.
Паулоко
10

У меня есть код меньшего размера:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}
YooRich.com
источник
Возвращает мне все файлы, кроме двух мусорных файлов с именем "." а также "..". У меня нет файла с именем "." и ".." в моем каталоге.
kamranbhatti585
1
Используйте $ files = array_diff (scandir ($ path), array ('.', '..')); чтобы избавиться от вышеуказанных ошибок, я уже говорил.
kamranbhatti585
Ницца. как мне удалить расширения для файлов? (Мне нужно удалить .phpкаждый файл.)
KSPR
8

На некоторых ОС у вас есть . ..и .DS_Store, ну, мы не можем их использовать, поэтому давайте спрячем их.

Сначала начните получать всю информацию о файлах, используя scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}
TheCrazyProfessor
источник
4

Это из-за предусмотрительности оператора. Попробуйте изменить его на:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);
ircmaxell
источник
2

glob()и FilesystemIteratorпримеры:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);
Даниэль
источник
1

Вы можете просто попробовать эту scandir(Path)функцию. это быстро и легко реализовать

Синтаксис:

$files = scandir("somePath");

Эта функция возвращает список файлов в массив.

для просмотра результата вы можете попробовать

var_dump($files);

Или

foreach($files as $file)
{ 
echo $file."< br>";
} 
Ад Кан
источник
0

Я просто использую этот код:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>
Меррайс
источник
0

Рекурсивный код для исследования всех файлов, содержащихся в каталоге ($ path содержит путь к каталогу):

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
Прашант Гоэль
источник