| |
// переходим по абсолютному пути
chdir("./somathing"); // переходим в подкаталог текущего каталога
chdir("something"); // то же самое
chdir(".."); // переходим в родительский каталог
chdir("~/data"); // переходим в /home/ПОЛЬЗОВАТЕЛЬ/data (для Unix)
string getcwd()
Возвращает полный путь к текущему каталогу, начиная от "корня" (/). Если такой
путь не может быть отслежен (это иногда бывает в Unix из-за того, что права на
чте-
ние для родительских каталогов могут быть сняты), вызов "проваливается" и
возвра-
щает false.
Эта функция появилась в PHP совсем недавно. Так что если ее не окажется в
вашей версии, обновите ее поскорее, либо напишите заменитель (что не так-то
просто).
Работа с записями
Дальше описываются функции, которые позволяют узнать, какие объекты находятся
в указанном каталоге. Например, с их помощью можно вывести содержимое текуще-
го каталога. Механизм работы этих функций базируется примерно на тех же принци-
пах, что и применяемых для файловых операций: сначала интересующий каталог от-
крывается, затем из него производится считывание записей, и под конец каталог
нужно закрыть. Правила интуитивно понятны и, наверное, хорошо вам знакомы.
int opendir(string $path)
Открывает каталог $path для дальнейшего считывания из него информации о фай-
лах и подкаталогах и возвращает его идентификатор. Дальнейшие вызовы
readdir() с идентификатором в параметрах будут обращены именно к этому ката-
логу. Функция возвращает false, если произошла ошибка.
Часть IV. Стандартные функции PHP 270
string readdir(int $handle)
Считывает очередное имя файла или подкаталога из открытого ранее каталога с
идентификатором $handle и возвращает его в виде строки. Порядок следования фай-
лов в каталоге зависит от операционной системы — скорее всего, он будет
совпадать
с тем порядком, в котором эти файлы создавались, но не всегда. Вместе с именами
подкаталогов и файлов будут также получены два специальных элемента: это .
(ссылка на текущий каталог) и .. (ссылка на родительский каталог). В
подавляющем
большинстве случаев нам нужно их игнорировать, что и сделано в примере из лис-
тинга 16.1 при помощи инструкции continue.
PHP версии 3 позволял опускать параметр $handle — в этом случае, кажется,
подразумевался последний открытый каталог. Сценарий "собирался с силами",
"вздыхал" и… кое-как работал. PHP версии 4 более строг: в нем вы обязатель-
но должны указывать параметр $handle для функции readdir(), в против-
ном случае вам гарантированы сюрпризы.
В случае, если в каталоге все файлы уже считаны, функция возвращает ложное зна-
чение. Но не позволяйте себе привыкнуть к конструкции такого вида:
$d=opendir("somewhere");
while($e=readdir($d)) { . . .}
Она заставит цикл прерваться в его середине в случае обнаружения файла с именем
"0", чего нам бы, конечно, не хотелось. Вместо этого пользуйтесь следующим
мето-
дом:
$d=opendir("somewhere");
while(($e=readdir($d))!==false) { . . .}
Оператор !== позволяет точно проверить, была ли возвращена величина false.
void closedir(int $handle)
Закрывает ранее открытый каталог с идентификатором $handle. Не возвращает ни-
чего. В принципе, можно и не закрывать каталоги, т. к. это делается
автоматически
при завершении программы, но лучше все-таки такой легкостью не обольщаться.
void rewinddir(int $handle)
"Перематывает" внутренний указатель открытого каталога на начало. После этого
можно воспользоваться readdir(), чтобы заново начать считывать содержимое ка-
талога.
Пример: печать дерева каталогов
В заключение приведу пример программы, которая рекурсивно распечатывает список
всех каталогов (доступных сценарию) в вашей системе, начиная от корневого.
Глава 16. Работа с каталогами 271
Листинг 16.1. Печать дерева каталогов в файловой системе
// Функция распечатывает имена всех подкаталогов в текущем каталоге,
// выполняя рекурсивный обход. Параметр $level задает текущую
// глубину рекурсии.
function PrintTree($level=1)
{
// Открываем кат
|
|