Функції для роботи з каталогами 11.7.1. Маніпуляції з каталогами При написанні сценаріїв, окрім вже описаних функцій для роботи з каталогами, нам пригодятся ще три: mkdir (string Sdir_name int Sperms) — створює каталог з ім'ям$dir_name і правами доступу $perms. rmdir( string Sdir_name) — видаляє порожній каталог. getcwd() — повертає поточний каталог. chdir(string Sdir_name) — змінює поточний каталог. Перша функція створює каталог і встановлює права доступу до цього каталога. Наприклад: // Створює каталог dir в поточному каталозі. Ви винні // мати право на запис в поточний // каталог mkdir("dir",0755) Звернете увагу, що використовується абсолютний (числовою) спосіб вказівки прав доступу, який був розглянутий вище. При цьому, оскільки вони задаються у восьмеричной системі, то необхідно сказати про це PHP, для чого вказати першим символом 0. Найчастіше встановлюють атрибути доступу 0770, що означає доступ на запис, читання і виконання для власника файлу і його групи. Друга функція rmdir(string Sdir_name) видаляє порожній каталог. Це означає, що якщо каталог містить файли, він не буде видалений. Третя функція getcwd() повертає поточний каталог.Остання функція, chdir(string Sdir_name), змінює поточний каталог, наприклад, chdir("/ var/wwwybtml/docs"). 11.7.2. Відкриття, читання і закриття каталогів Каталог — це звичайний файл, що містить інформацію про файли, що знаходяться «в нім». Послідовність роботи з каталогом така ж, як і з файлом: відкрити, прочитати (писати в каталог ми не можемо) і закрити. Для цього в PHP є три функції: opendir(string $dir_name) — відкриває каталог, після чого ми можемопрацювати з каталогом: читати зміст каталога. Функція повертає дескриптор каталога $handle, який потрібно указувати якаргументу при виклику інших функцій для роботи з каталогом; readdir(int Shadle) — прочитує наступне ім'я файлу або підкаталогу, які знаходяться в каталозі, заданим дескриптором Shandle; closedir(int ShadIe) — закриває каталог. Приклад сумісного використання всіх трьох функцій приведений в лістингу ll.l4. Результат роботи приведений на мал. ll.l0. Лістинг 11.14. Відкриття, читання і закриття каталогів $dir = opendir("/var/www/html"); chdir("/var/www/html"); echo "<html><head><title>ne4aTb кaтaлoгa</title></head><body>"; echo "<Ы>Оглавление каталога</Ы><р>"; echo "<table width=100%>"; while ($d=readdir($dir)) { echo "<tr><td>"; if (is_dir($d)) if (is_file(?d) echo "<tr>"; echo "$d</td><td>Kaтaлoг</td>"; echo "$d</tdxtd>".filesize($d) ."</td>"; echo "</table></body></html>"; closedir($dir); Тепер проаналізуємо програму. Спочатку ми відкриваємо каталог (opendir), потім робимо його поточним (chdir). У циклі while ($d=readdir ($dir) ) ми читаємо каталог і аналізуємо його записи - $d. Якщо $d — це каталог (is_dir), виводимо у відповідний елемент таблиці слово «Каталог», а якщо $d — файл (is_file), то виводиться його розмір (fiIesize). Прочитавши всі записи каталога, ми його закриваємо (closedir). Примітка. Як ви вже встигли здогадатися, функція is_dir(string Sname) повертає true, якщо передане нею ім'я є ім'ям каталога, а не файлу. А функція is_file(string name), навпаки, повертає true, якщо ми передали їй ім'я файлу, а не каталога.
Мал. 11.10. Вміст каталога Цикл while ($d=readdir ($dir) ) не дуже практичний: якщо в каталозі опиниться файл з ім'ям 0, то цикл припинить свою роботу. Тому краще використовувати наступний цикл: while(($d = readdir($d))!==false) Каталог, як і файл, володіє покажчиком поточної позиції. Щоб по десять разів не закрывать/открывать каталог, для скидання покажчика можна використовувати функцію rewinddir(), яка «перемотує» каталог на початок: $dir = opendir("dir"); rewinddir($dir); closedir($dir);