Задача
Необходимо выполнить цикл по всем файлам в каталоге. Например, требуется создать элемент select в форме, содержащей список всех файлов в каталоге.
Решение
Получите дескриптор каталога с помощью функции opendir(), а затем извлеките имя каждого файла, вызвав функцию readdir():
$d = opendir('/tmp') or die($php_errormsg);
while (false !== ($f = readdir($d))) {
print "$f\n";
}
closedir($d);
Обсуждение
Фрагмент кода в разделе «Решение» проверяет возвращенное функцией readdir() значение с помощью оператора тождественного неравенства (!==), поэтому этот код работает с именами файлов, которые могут программно интерпретироваться как false, например, если имя файла 0.
Функция readdir() возвращает любой элемент каталога – является ли он файлом, каталогом или чем-нибудь еще (например, ссылкой или сокетом). Сюда же входят метаэлементы «.» (текущий каталог) и «..» (родительский каталог). Для того чтобы вернуть только файлы, вызовите также функцию is_file():
print '<select name="files">';
$d = opendir('/usr/local/upload') or die($php_errormsg);
while (false !== ($f = readdir($d))) {
if (is_file("/usr/local/upload/$f")) {
print '<option> ' . $f . '</option>';
}
}
closedir($d);
print '</select>';
Функция readdir() возвращает только имя файла каждого вхождения каталога, а не полное имя пути, поэтому необходимо предварять именем каталога переменную $f, прежде чем передавать ее функции is_file().
В PHP есть также объектно-ориентированный интерфейс к информации каталога. Функция dir() возвращает объект, в котором можно вызвать методы read(), rewind() и close(), действующие подобно функци-ям readdir(), rewinddir() и closedir(). У него есть также свойство $path, содержащее полное имя пути к открытому каталогу.
Ниже показано, как выполнить цикл по файлам с помощью объектноориентированного интерфейса:
print '<select name="files">';
$d = dir('/usr/local/upload') or die($php_errormsg);
while (false !== ($f = $d->read())) {
if (is_file($d->path.'/'.$f)) {
print '<option> ' . $f . '</option>';
}
}
$d->close();
В этом примере $d->path равно /usr/local/upload.