PHP Получает список файлов из каталога (в Moodle)
Вопрос
Я хочу открыть каталог, прочитать все файлы внутри и поместить их в 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;