PHP Получает список файлов из каталога (в Moodle)

StackOverflow https://stackoverflow.com/questions/2337642

  •  22-09-2019
  •  | 
  •  

Вопрос

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

$imagesdir = $CFG->dataroot.'/1/themeimages/';

Который дает мне путь к каталогу, каков следующий шаг?

Это было полезно?

Решение

Поскольку из вашего списка тегов я предполагаю, что вы используете Moodle, вы можете просто использовать:

function get_directory_list($rootdir, $excludefiles='', $descend=true, $getdirs=false, $getfiles=true)

Функция содержится в moodlelib.php.

Чтение из документа:

  • Возвращает массив со всеми именами файлов во * всех подкаталогах, относящимися к заданному корневому каталогу.

Пожалуйста, обратитесь к официальному документу для получения дополнительной информации о дополнительных параметрах.

Функции для чтения содержимого файлов также доступны в filelib.php.

Другие советы

Решением было бы использовать opendir + readdir + closedir (цитирую пример с первой страницы) :

$imagesdir = $CFG->dataroot.'/1/themeimages/';
if ($handle = opendir($imagesdir)) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo "$file\n";
        }
    }
    closedir($handle);
}


Другим решением было бы использовать тот [DirectoryIterator сорт ;цитирую пример из]4 тот __construct страница :

$imagesdir = $CFG->dataroot.'/1/themeimages/';
$dir = new DirectoryIterator($imagesdir);
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}


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

Это будет означать инициализацию массива перед циклом:

$list_files = array();

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

$list_files[] = $file;
$list_files[] = $fileinfo->getFilename();

Просто используйте встроенную функцию скандир:

Возвращает массив файлов и каталогов из каталога.

Итак, вы бы использовали его так:

$array = scandir($imagesdir);

Конечно, вы также можете использовать DirectoryIterator, но это намного проще.

Вы также можете удалить точечные файлы:

$array = array_diff(scandir($imagesdir), array('.', '..'));

Для более объектно-ориентированного подхода используйте класс DirectoryIterator.

$images = array();
$imagesdir = $CFG->dataroot.'/1/themeimages/';
foreach (new DirectoryIterator($imagesdir) as $file) {
   if($file->isDot()) continue;
   $images[] = $file;
}

вот самое короткое решение, если вам также понадобится фильтр позже:

$imagesdir = $CFG->dataroot.'/1/themeimages/*.*';
foreach (glob($imagesdir) as $file)
  array_push($files,$file);

php автоматически исключает . и ..

вы также можете указать свою собственную маску, если вам не нужны ВСЕ файлы, как показано выше. *.*php также автоматически создает $files массив для вас.

последняя строка также может быть:

$files[]=$file;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top