Получение имен всех файлов в каталоге с помощью PHP - PullRequest
77 голосов
/ 27 мая 2010

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

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

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

Ответы [ 15 ]

149 голосов
/ 27 мая 2010

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

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}
44 голосов
/ 23 сентября 2014

SPL стиль:

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

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

17 голосов
/ 27 мая 2010

Вам необходимо заключить в скобки $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 />';
}
13 голосов
/ 27 мая 2010

Просто используйте glob('*'). Вот Документация

12 голосов
/ 16 января 2016

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

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

У меня есть меньший код для этого:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}
4 голосов
/ 27 мая 2010

Это связано с точностью оператора. Попробуйте изменить его на:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);
3 голосов
/ 12 апреля 2015

В некоторых ОС вы получаете . .. и .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>";
    }
}
2 голосов
/ 24 марта 2015

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 голос
/ 31 мая 2016

Другим способом составления списка каталогов и файлов будет использование ответа RecursiveTreeIterator здесь: https://stackoverflow.com/a/37548504/2032235.

Подробное объяснение RecursiveIteratorIterator и итераторов в PHP можно найти здесь: https://stackoverflow.com/a/12236744/2032235

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...