Функції для роботи з каталогами
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);