Управление файлами и каталогами
Автор: | Артемьев Сергей Игоревич |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Под управлением файлами и каталогами в 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"; } ?>
Рассмотренных в этом уроке функций достаточно для решения большинства практических задач. Необходимость использования средств управления файлами возникает практически в каждом среднем и крупном проекте. Чаще всего упомянутые функции используются для работы с файловыми архивами, фото- и видеоальбомами, а так же при загрузке пользователями файлов на сервер.