Анимация
JavaScript
|
Главная Библионтека ( Замечание 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() , чтобы заново начать считывать содержимое каталога. Пример: печать дерева каталогов В заключение приведу пример программы, которая рекурсивно распечатывает список всех каталогов (доступных сценарию) в вашей системе, начиная от корневого. string readdir(int $handle) Считывает очередное имя файла или подкаталога из открытого ранее каталога с идентификатором $handle и возвращает его в виде строки. Порядок следования файлов в каталоге зависит от операционной системы - скорее всего, он будет совпадать с тем порядком, в котором эти файлы создавались, но не всегда. Вместе с именами подкаталогов и файлов будут также получены два специальных элемента: это . (ссылка на текущий каталог) и .. (ссылка на родительский каталог). В подавляющем большинстве случаев нам нужно их игнорировать, что и сделано в примере из листинга 16.1 при помощи инструкции continue. ! Листинг 16.1. Печать дерева каталогов в файловой системе <? Функция распечат1вает имена всех подкаталогов в текущем каталоге, в1полняя рекурсивн1й обход. Параметр $level задает текущую глубину рекурсии. function PrintTree($level=1) Открываем каталог и выходим в случае ошибки $d=@opendir("."); if(!$d) return; while(($e=readdir($d))!==false) { Игнорируем элементы и . if($e==.$e==..) continue; Нам нужны только подкаталоги if(!@is dir($e)) continue; Печатаем пробелы, чтобы сместить вывод for($i=0; $i<$level; $i++) echo " "; Выводим текущий элемент echo "$e\n"; Входим в текущий подкаталог и печатаем его if(!chdir($e)) continue; PrintTree($level+1); Возвращаемся назад chdir(".."); Отправляем данные в браузер, чтобы избежать видимости зависания для больших распечаток flush(); closedir($d); Выводим остальной текст фиксированным шрифтом echo "<pre>"; echo "/\n"; Входим в корневой каталог и печатаем его chdir("/"); PrintTree(); echo "</pre>"; ?> Сразу хочу предупредить, что результат работы этого сценария представляет собой довольно длинную распечатку. Кроме того, программа работает медленно, т. к. ей нужно будет обойти тысячи каталогов вашей системы. ( Замечание Последний факт делает метод рекурсивного обхода каталогов совершенно непригодным для автоматического построения карты сервера. В случае применения технологии кэширования информации между запусками сценариев для больших сайтов построение карты даже, скажем, раз в час, выглядит довольно плачевно. Как обойти эту трудность (фактически, используя кэш и разделенные вычисления) рассказано в части V этой книги. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 [ 89 ] 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |