Можно не только просматривать и получать информацию о каталогах, но и взаимодействовать с веб-сервером и получать информацию о файлах, хранящихся на нем. Мы уже рассматривали запись файлов и их чтение. Однако существует и множество других полезных функций.
Можно изменить ту часть сценария просмотра каталога, которая читает файлы, следующим образом:
while ($file = readdir ($dir))
{
echo '<a href = "filedetails.php?file = '.$file.' "> ' .file. '</a><br>';
}
Затем потребуется создать сценарий filedetails.php, выдающий дополнительную информацию о файле. Содержимое этого сценария представлено ниже.
Предупреждение по поволу этого сценария: некоторые используемые здесь функции не поддерживаются системой Windows (или не так, как следует); в их числе функции posix_getpwuid(), fileowner() и filegroup().
filedetails.php —функции работы со статусом файлов и их результаты
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Информация о файле</title>
</head>
<body>
<?php
$current_dir = '../../phpstroy/test/';
$file = basename($file); //удаление информации о каталоге для большей безопасности
echo '<h1> Информация о файле: '.$file.'</h1>';
$file = $current_dir.$file;
echo '<h2> Данные о файле </h2>';
echo 'Последнее обращение: '.date('j F Y H:i', fileatime($file)). '<br>';
echo 'Последняя модификация: '.date('j F Y H:i', filemtime($file)).'<br>';
$user = posix_getpwuid(fileowner($file));
echo 'Владелец файла: '.$user['name'].'<br>';
$group = posix_getgrgid(filegroup($file));
echo 'Группа файла: '.$group['name'].'<br>';
echo 'Права доступа: '.decoct(fileperms($file)).'<br>';
echo 'Тип файла: '.$filetype($file).'<br>';
echo 'Размер файла: '.filesize($file).'байтов <br>';
echo '<h2>Статус файла</h2>';
echo 'Каталог: '.(is_dir($file)? 'да':'нет'). '<br>';
echo 'Исполняемый: '.(is_executable($file)? 'да':'нет'). '<br>';
echo 'Файл: '.(is_file($file)? 'да':'нет').'<br>';
echo 'Ссылка: '.(is_link($file)? 'да':'нет').'<br>';
echo 'Разрешено чтение: '.(is_readable($file)? 'да':'нет').'<br>';
echo 'Разрешена запись: '.(is_writable($file)? 'да':'нет').'<br>';
?>
</body>
</html>
Пример результата выполнения сценария, показан на рисунке.
А теперь, разберемся, что выполняет каждая функция, которая используется в листинге. Функция basename() возвращает имя файла без каталога. Можно также использовать функцию dirname(), чтобы получить имя каталога без имени файла.
Функции fileatime() и filemtime() возвращают метку времени, соответственно, последнего обращения к файлу и его последней модификации. Для наглядности метки времени были отформатированы с помощью функции date(). Для некоторых операционных систем эти функции могут дать одно и тоже значение — это зависит от того, какую информацию сохраняет система.
Функции fileowner() и filegroup() возвращают идентификатор пользователя (uid) и идентификатор группы (gid) файла. Они могут быть преобразованы в имена с помощью функций posix_getwuid() и posix_getgrgid(), соответственно, послечего воспринимаются несколько лучше. Эти функции в качестве параметра принимают uid или gid и возвращают ассоциированный массив с информацией о пользователе или группе, в том числе имя пользователя или группы.
Функция fileperms() возвращает права доступа к файлу. В примере они переформатированы с помощью функции decoct() в восьмеричный вид, более привычный для пользователей UNIX-систем.
Функция filetype() возвращает информацию о типе анализируемого файла. Ее возможными результатами являются: fifo, char, dir, block, link, file и unknown.
Функция filesize() возвращает размер файла в байтах.
Функции из следующего набора: is_dir(), is_executable(), is_file(), is_linl(), is_readable() и is_writable() —тестируют соответствующие атрибуты файла и возвращают true или false.
Вместо них аналогичную информацию можно получить с помощьюфункции stat(). По заданному файлу она возвращает массив, содержащий данные, аналогичные результатам вышеприведенных функций. Похожим образом работает и функция lstat(), но она применяется для символических ссылок.
Все функции работы со статусом файла требуют серьезных затрат времени для своего выполнения, поэтому результаты их работы кэшируются. Если нужно получить некоторую информацию о файле до изменения и после, необходимо с помощью функции:
clearstatcache();
очистить предыдущие результаты. Для использования последнего сценария до и после изменения некоторой информации о файле нужно в начало сценария вставить вызов этой функции, чтобы гарантировать получение самых свежих данных.
Можно не только просматривать свойства файла, но и изменять их.
Каждая из функций chgrp(file, group), chmod(file, permissions) и chown(file, user) работает аналогично своему эквиваленту в операционной системе Unix. Ни одна из нихне работает в Windows, хотя функция chown() выполняется и всегда возвращает true.
Функция chgrp() применяется дляизменения группы, имеющей доступ к файлу. Она может изменить группу лишь на одну из тех, членами которых является пользователь, если это только не привлегированный пользователь root.
Функция chmod() изменяет права доступа к файлу. Права доступа, передаваемые ей в качестве параметра,записываются в обычный для Unix-команды chmod форме. Чтобы показать, что они записаны в восьмеричной форме, впереди надо прописать "0", например:
chmod('somefile.txt', 0777);
Функция chown() изменяет владельца файла. Ее можно применять, только если сценарий выполняется с правими root, чего происходить не должно, если только вы не запускаете сценарий из командной строки для выполнения задач администрирования.
С помощью функций файловой системы файлы можно создавать, перемещать и удалять.
Первое, и самое простое, что можно сделать — это создать файл или изменить время его последней модификации, используя для этого функцию touch(). Она работает аналогично Unix-команде touch. Прототип функции имеет следующий вид:
int toutch (string file, [int time [, int atime] ])
Eсли такой файл уже существует, время его последней модификации будет изменено либо на текущее время, либо на время, заданное вторым параметром, если он присутствует. Если нужно задать это время, оно должно быть задано в формате метки времени. Если файл не существует, он будет создан. Время последнего обращения к файлу также будет изменено: по умолчанию — на текущее системное время либо на метку времени, если задан необязательный параметр atime.
Удалить файл можно с помощью функции unlink(). Используется она следующим образом:
unlink($filename);
Это одна из функций, которая не работает в некоторых старых версиях Windows. В этом случае в Windows можно удалять файлы с помощью
system("del filename.ext");
Копировать и пересылать файлы можно с помощью функций copy() и rename(), как показано ниже:
copy ($source_path, $destination_path);
rename ($oldfile, $newfile);
Функция rename() имеет двойное назначение: она еще и перемещает файлы из одного места в другое, поскольку в PHP нет специальной функции перемещения. Возможность перемещения файлов из одной файловой системы в другую и перезаписи поверх старых файлов при использовании функции rename() зависит от операционной системы, так что необходимо ознакомится с возможностями вашего сервера. Также надо соблюдать осторожность при использовании пути в имени файла. Если он относительный, то относительно местонахождения сценария, а не самого файла.