Функции для работы с каталогами. Чтение, создание и удаление каталогов

После того, как пользователи загрузили нужные файлы, было бы удобно дать им возможность просматривать загруженные файлы и работать с содержимым текстовых файлов. В PHP реализован набор функций для работы с файлами и каталогами, с помощью которых и решаются задачи подобного рода.

Чтение содержимого каталога

Первый сценарий, который мы реализуем, предназначен для просмотра содержимого каталога с загруженными файлами. Рассмотрим простой сценарий, используемый для достижения данной цели.

browsedir.php — вывод содержимого каталога с загруженными файлами

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Просмотр каталога</title>
</head>

<body>
<h1>Просмотр</h1>
<?php
$current_dir = '../../phpstroy/test/';
$dir = opendir($current_dir);
echo "<p>Каталог загрузки: $current_dir</p>";
echo '<p>Содержимое каталога:</p><ul>';
while ($file = readdir($dir))
{
echo "<li>$file</li>";
}
echo '</ul>';
closedir($dir);
?>
</body>
</html>

Сценарий выведет список файлов в каталоге.

Список файлов в каталоге показывает все файлы в выбранном каталоге, в том числе и . (текущий каталог и .. (родительский каталог)

В данном сценарии используются функции opendir(), closedir(), readdir().

Функция opendir() открывает каталог для чтения. Ее применение аналогично функции открытия файла fopen(), только вместо имени файла нужно передать имя каталога:

$dir = opendir($current_dir);

Эта функция возвращает дескриптор каталога, опять-таки аналогично тому, как функция fopen() возвращает дескриптор файла.

После открытия каталога можно прочитать имя файла с помощью вызова readdir($dir), как показано в нашем примере. Если в каталоге больше нет файлов, эта функция возвращает false. Однако она возвращает false и в том случае, если прочитано имя файла "0" — конечно, если такой случай возможен, потребуется предусмотреть соответствующую проверку). Файлы никак не сортируются, так что если нужет отсортированный список, надо будет прочитать их в массив и отсортировать его перед отображением на экране.

После завершения работы с каталогом нужно вызвать функцию closedir($dir), чтобы закрыть его. Это тоже похоже на вызов функции fclose(), работающей с файлами.

Если вы хотите применять этот механизм для просмотра каталогов, разумно ограничить список доступных для просмотра каталогов,чтобы пользователь не смог просматривать каталоги, обычно недоступные для него.

Иногда бывает полезной функции rewinddir($dir), которая возвращает чтение имен файлов на начало каталога.

Вместо этих функций можно использовать класс dir, предоставляемый РНР. В нем имеются свойства handle и path и методы read(), close() и rewind(), выполняющие те же действия, что и их необъектные аналоги.

Получение информации о текущем каталоге

Если имеется путь к файлу, то можно получить некоторые дополнительные сведения.

Функция dirname($path) возвращает часть пути, содержащие, соответственно, каталог и имя файла. Эта информация может пригодиться в нашей программе просмотра каталога, особенно в тех случаях, когда требуется создать сложную структуру каталогов, основанную на осмысленных именах каталогов и файлов.

С помощью функции disk_free_space($path) в список содержимого каталога можно также включить индикацию свободного места для загружаемых файлов. Если передать этой функции путь к каталогу, она выдаст количество байтов, свободных на диске (в Windows) или файловой системе (в Unix), в которой находится каталог.

Создание и удаление каталогов

Кроме пассивного чтения информации о каталогах, можно создавать и удалять каталоги с помощью PHP-функций mkdir() и rmdir(). Создавать и уничтожать каталоги можно только в тех путях, к которым разрешен доступ пользователю, выполняющему сценарий.

Использование функции mkdir() не так просто, как может показаться на первый взгляд. Она принимает два параметра: путь к желаемому каталогу (включая и имя создаваемого каталога) и права доступа, которые вы хотите назначить каталогу, например:

mkdir ("/tmp/testing", 0777);

Однако права доступа, указанные вами, не обязательно станут результирующими. Инвертированное значение текущей маски umask будет скомбинировано с помощью операции AND, в результате чего получатся реальные права доступа. Например, если umask равна 022б то получаться права доступа 0755.

Чтобы учесть данный эффект, перед созданием каталога можно сбросить маску umask с помощью следующего кода:

$oldmask = umask (0);
mkdir ("tmp/testing", 0777);
umask ($oldmask);

В этом коде задействована функция umask(), которая используется и для получения значения, и для изменения текущей маски umask. Она заменяет еткущее значение umask на переданный ей параметр и возвращает старое значение umask, а если вызвать ее без параметров, то просто возвращает значение текущей маски доступа.

Понятно, что в системе windows функция umask() не выполняет никаких действий.

Функция rmdir() удаляе каталог следующим образом:

rmdir("/tmp/testing");

или

rmdir("C: \\tmp\\testing");

Удаляемый каталог должен быть пуст.




  • Другие |
назадвверхвперед
Rambler's Top100