PHP Получить список файлов из каталога (в Moodle) - PullRequest
2 голосов
/ 26 февраля 2010

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

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

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

Ответы [ 5 ]

2 голосов
/ 01 марта 2010

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

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

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

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

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

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

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

2 голосов
/ 26 февраля 2010

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

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

Так что вы бы использовали это так:

$array = scandir($imagesdir);

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

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

$array = array_diff(scandir($imagesdir), array('.', '..'));
2 голосов
/ 26 февраля 2010

Решением было бы использовать 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();
1 голос
/ 26 февраля 2010

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

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

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

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

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

$files[]=$file;
1 голос
/ 26 февраля 2010

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

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