Под управлением файлами и каталогами в PHP подразумеваются такие операции как:
- Создание/удаление
- Копирование/перемещение
- Переименование
- Изменение аттрибутов
- Чтение содержимого каталога
Копирование файлов производится с помощью функции copy(). Функция имеет всего 2 параметра — имя исходного файла и имя конечного файла. Функция возвращает TRUE, если копирование прошло успешно, и FALSE если произошла ошибка. Если конечный файл уже существует — он будет перезаписан и функция вернёт TRUE. При использовании copy() на Windows-платформе есть особенность: если скопировать файл нулевого размера, то файл успешно скопируется, но copy() вернёт FALSE.
Пример копирования файла:
<?php
$source = 'readme.txt';
$dest = 'readme_copy.txt';
if(!copy($source, $dest)) {
echo "Ошибка копирования файла $source...<br />\n";
}
?>
Обратите внимание на конструкцию «<br />\n» в конце строки с ошибкой. Этот простой приём позволяет получать читаемый вид выводимого текста независимо от того куда текст выводится — в консоль отладчика или в браузер. Очень удобно на этапе отладки скрипта.
Более сложный процесс — перемещение файла. Для выполнения перемещения служит функция rename(). Как и предыдущая функция, rename() принимает всего 2 агрумента — старое и новое имя файла. Если пути старого и нового файлов одинаковые — файл просто переименуется, а если разные — будет перемещен но повому пути и переименован.
Пример переменования и перемещения файла:
<?php
$number = 123;
$source = 'readme.txt';
$dest = "./backups/readme_$number.txt";
if(!rename($source, $dest)) {
echo "Ошибка перемещения файла $source...<br />\n";
}
?>
В этом примере исходный файл readme.txt перемещается в подкаталог backups и переименовывается в readme_123.txt.
Удалить существующий файл можно с помощью функции unlink(). Файловая система Unix позволяет создавать жесткие ссылки на существуюие файлы. Ссылка похожа на ярлыки Windows, но в Unix нельзя удалить исходный файл, пока на него есть жесткие ссылки. Функция unlink() удаляет вашу ссылку на файл, а если ссылок больше нет — удаляет его.
<?php
$file = "./backups/readme_123.txt";
if(!unlink($file)) {
echo "Ошибка удаления файла $file...<br />\n";
}
?>
Для удаления каталогов служит другая функция — rmdir(). Она принимает единственный параметр — имя каталога, который нужно удалить. Удаляемый каталог должен быть пуст, иначе операция завершится с ошибкой. Если каталог успешно удалён — функция вернёт TRUE, в противном случае — FALSE.
<?php
$directory = "./backups";
if(!rmdir($directory)) {
echo "Ошибка удаления каталога $directory...<br />\n";
}
?>
Отдельной функции для создания файлов в PHP нет. Все функции, позволяющие создать файл, выполняют и ряд других операций, но об этом мы поговорим в следующем уроке.
Для создания каталога в PHP применяется функция mkdir(). Функция получает 1 параметр — имя создаваемого каталога. Если каталог успешно создан — функция вернёт TRUE, а при ошибке — FALSE.
<?php
$directory = "./backups";
if(!mkdir($directory)) {
echo "Ошибка создания каталога $directory...<br />\n";
}
?>
Дополнительные функции
В PHP есть ряд функций, существенно помогающих в работе. Список функций с кратким описанием приведён в таблице.
Функция | Описание |
string basename ( $path [, $ext] ) | Извлекает из полного пути $path только имя файла. Если указано расширение $ext — оно обрезается. <?php
$full_path = "/full/path/to/myfile.txt";
echo basename($full_path);
// выводит "myfile.txt"
echo basename($full_path, '.ext');
// выводит "myfile"
?>
|
string dirname ( $path ) | Извлекает из полного пути $path только путь к файлу (без имени и расширения) <?php
$full_path = "/full/path/to/myfile.txt";
echo dirname($full_path);
// выводит "/full/path/to"
?>
|
bool file_exists ( $filename ) | Проверяет, существует ли файл или каталог $filename. Функция возвращает TRUE, когда файл или каталог существует и доступен. <?php
$filename = "/full/path/to/myfile.txt";
if(file_exists($filename))
echo 'Файл существует';
else
echo 'Файл не существует';
?>
|
int fileatime ( $filename ) | Возвращает дату и время последнего обращения к файлу |
int filectime ( $filename ) | Возвращает дату и время последнего изменения файла |
int filesize ( $filename ) | Возвращает размер файла в байтах |
string filetype ( $filename ) | Возвращает тип файла. Может возвращать сделующие значения: fifo, char, dir, block, link, file, unknown. |
bool is_dir ( $filename ) | Проверяет, является ли $filename каталогом |
bool is_file ( $filename ) | Проверяет, является ли $filename файлом |
bool is_uploaded_file ( $filename ) | Проверяет, является ли $filename файлом, загруженным на сервер через веб-форму. |
| <?php
$filename = "/full/path/to/myfile.txt";
if (file_exists($filename)) {
echo "Последнее обращение: " .
date("F d Y H:i:s.", fileatime($filename));
echo "Последнее изменение: " .
date("F d Y H:i:s.", filectime($filename));
echo 'Размер: ' . filesize($filename) . ' байт';
echo 'Тип объекта: ' . filetype($filename);
}
?>
|
mixed pathinfo ( $path [, $options] ) | Возвращает строку или массив строк, содержащий части пути $path (имя каталога, имя файла, расширение) <?php
$filename = "/full/path/to/myfile.txt";
$parts = pathinfo($filename);
echo $parts['dirname'], "\n";
echo $parts['basename'], "\n";
echo $parts['extension'], "\n";
echo $parts['filename'], "\n";
// получим на выходе
// /full/path/to
// myfile.txt
// txt
// myfile
?>
|
string realpath ( $path ) | Преобразует относительный путь к файлу в реальный полный путь на сервере. Все символические ссылки так же преобразуются в реальные имена каталогов и файлов. <?php
echo realpath('.') . "./myfile.txt";
// получим
// /full/path/to/myfile.txt
?>
|
string tempnam ( $dir, $prefix ) | Создаёт в каталоге $dir временный файл со случайным именем, начинающимся с $prefix. Если параметры не заданы — будет создан временный файл в глобальном временном каталоге с полностью случайным именем. Созданный файл сохраняется после завершения работы скрипта и закрытия файла. <?php
$temp_name = tempnam ($dir, $prefix);
echo $temp_name;
unlink($temp_name);
?>
|
resource tmpfile ( void ) | Создаёт в системном временном каталоге временный файл со случайным именем. Созданный файл удаляется немедленно после закрытия. <?php
$temp_file = tmpfile();
fwrite($temp, "=пишем в файл...=");
fseek($temp, 0);
echo fread($temp, 1024);
// выводится
// =пишем в файл...=
fclose($temp); // закрываем и удаляем файл
?>
Функции работы с данными внутри файла мы рассмотрим в следующем уроке. |
В таблице приведены не все функции, используемые при работе с файлами. Полный список вы сможете найти в документации на официальном сайте.
Поиск файлов и каталогов
Для поиска файлов в каталогах сервера используется несколько функций: glob(), fnmatch() и функции работы с каталогами (opendir(), readdir(), rewinddir(), closedir()).
Функция opendir() открывает указанный каталог и устанавливает внутренний указатель на первый файл. Функция возвращает так называемый «handle» (читается «хэндл») или «указатель». Этот указатель передаётся всем последующим функциям при работе с данным каталогом.
Функция readdir() возвращает имя текущего файла в каталоге и перемещает внутренний указатель на следующий файл. Если последний файл уже был прочитан — функция вернёт FALSE. Функция rewinddir() сбрасывает внутренний указатель на первый файл в каталоге. Функция closedir() закрывает ранее открытый каталог и освобождает всеи используемые ресурсы.
Функция fnmatch($pattern, $filename) проверяет, соответствует ли имя файла $filename маске $pattern.
Пример поиска файла по шаблону:
<?php
$dir = "./backups/";
// проверяем, что $dir - каталог
if (is_dir($dir)) {
// открываем каталог
if ($dh = opendir($dir)) {
// читаем и выводим все элементы
// от первого до последнего
while (($file = readdir($dh)) !== false) {
if(fnmatch('myfile_*.txt', $file))
echo 'Резервная копия: ';
echo "$file : " .
filetype($dir . $file) . "<br />\n";
}
// закрываем каталог
closedir($dh);
}
}
?>
Функция glob( $pattern ) возвращает массив файлов и каталогов, соответствующих маске $pattern. Если произошла ошибка или ничего не найдено — функция вернёт FALSE.
Пример:
<?php
foreach (glob("./backups/*.txt") as $filename) {
echo "$filename : " . filesize($filename) . " байт\n";
}
?>
Рассмотренных в этом уроке функций достаточно для решения большинства практических задач. Необходимость использования средств управления файлами возникает практически в каждом среднем и крупном проекте. Чаще всего упомянутые функции используются для работы с файловыми архивами, фото- и видеоальбомами, а так же при загрузке пользователями файлов на сервер.