После того, как пользователи загрузили нужные файлы, было бы удобно дать им возможность просматривать загруженные файлы и работать с содержимым текстовых файлов. В 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");
Удаляемый каталог должен быть пуст.