Листинг 7. Исключение каталогов "." и ".." из списка содержимого каталога

<?php

// Открываем каталог

$dir = opendir(".");

//В цикле выводим его содержимое

while (($file = readdir($dir)) !== false)

{

if($file != "." && $file != "..") echo "$file<br>";

}

// Закрываем каталог

closedir($dir); ?>

При создании Web-приложений часто встает задача определения количества файлов или каталогов в подкаталоге, что требует различать файлы и подкаталоги. Для этого предназначены функции is_file() и is_dir(), которые имеют следующий синтаксис:

bool is_file(string filename) bool is_dir(string filename)

Обе функции принимают в качестве аргумента имя файла или каталога. Функция is_file() возвращает true в том случае, если по переданному ей пути в качестве аргумента находится файл, и false — в противном случае. Аналогичным образом ведет себя и функция is_dir(), только по отношению к каталогу.

( Замечание)

В РНР имеется функция file_exists (), которая проверяет наличие по пути, переданного ей в качестве аргумента файла или каталога. Если такой файл или каталог существует, функция возвращает true, если нет — false.

С учетом рассмотренных функций задачу подсчета файлов и подкаталогов в каталоге можно решить так, как показано в листинге 7.

 

Листинг 7. Подсчет количества файлов и подкаталогов в каталоге

<?php

$file_count =0; // Счетчик файлов

$dir_count =0; // Счетчик подкаталогов

$arr = scandir("."); // Возвращаем массив с содержимым каталога

foreach($arr as $file)

{

//Если это текущая или вышележащая папка, пропускаем //обработку

//и переходим к следующему циклу

if($file == "." || $file == "..") continue;

// Если это каталог, увеличиваем счетчик каталогов

if(is_dir($file)) ++$dir_count;

// Если это файл, "увеличиваем счетчик файлов

if(is_file($file)) ++$file_count; )

// Выводим результаты

echo "В текущем каталоге содержится $dir_count подкаталогов,<br>";

echo "а также $file_count файлов"; ?>

Работа с правами доступа

Большинство Web-разработчиков при создании Web-приложений используют в качестве операционной системы Windows, в то время как большинство серверов работает под управлением UNIX-подобной операционной системы, которая имеет отличную от Windows систему прав доступа.

В UNIX права доступа выставляются для трех групп:

□ владельца файла;

□ группы, в которую входит владелец файла;

□ всех остальных.

Для каждой из групп права доступа задаются восьмеричным числом. При этом праву чтения соответствует цифра 4, праву записи — 2, а исполнению — 1. Общие права для групп задаются суммой этих чисел, так значение 6 (4 + 2) обеспечивает возможность чтения и записи, а значение 7 (4 + 2 + 1) предоставляет полный доступ к файлу или каталогу.

Для файлов наиболее приемлемые права доступа таковы: чтение и запись для владельца и чтение для всех остальных— 644. Для того чтобы иметь возможность "заходить" в каталог, для него необходимо выставить права доступа и на исполнение, поэтому для каталогов следует выставлять 755.

 

Для смены прав доступа в РНР предназначена функция chmod(), которая имеет следующий синтаксис:

bool chmod(string filename, int mode)

Функция принимает в качестве первого параметра имя файла filename, в качестве второго mode — восьмеричное число, задающее права доступа к файлу.

(Замечание )

Восьмеричное число в РНР предваряется 0, например, 0755, Число 755 не является восьмеричным и будет интерпретироваться как десятичное.

Пример — в листинге 8.

Листинг 8. Изменение прав доступа к файлу

<?php

//Изменяем права доступа к файлу. Для указания принадлежности числа

//к восьмеричной системе перед ним записывается 0

chmod("index.php", 0644); ?>

Если требуется изменить права доступа сразу ко всем файлам каталога, следует воспользоваться чтением содержимого каталога в цикле, с проверкой - является ли очередной элемент каталога файлом. Пример в скрипте из листинга 9.