Доступ к файлам и манипуляции с ними в PHP
PHP — это язык программирования,интерпретатор которого располагается на сервере. Сервер обладает своим пространством для хранения данных. Поэтому логично было снабдить PHP возможностью манипуляциями не только с оперативной памятью, но и сохранением данных на постоянные носители.
Одной из важных способностей PHP — запись и чтение текстовых, а также бинарных файлов. Поскольку PHP работает с HTTP и FTP протоколами, становится понятным, что он способен загружать не только текстовую информацию, но также и передавать данные аудио, видео и графических файлов.
Открытие файлов
Прежде, чем работать с файлом, его нужно открыть. Для этой цели в языке предусмотрена функция fopen($fname, $mode). Первый параметр указывает имя файла и путь к нему, второй параметр указывает режим открытия для записи, чтения и другие.
Путь к файлу указывается в виде строки и выглядит следующим образом:
D:\documents\files\somefile.txt.
Второй параметр также является строкой и может получить одно из следующих значений:
- «r» — открытие для чтения.
- «w» — для записи.
- «а» — для продолжения записи с сохранением оставшихся данных.
Возможности расширяются, если к параметру добавить «+»:
- «r+» — для чтения и записи.
- «w+» — для записи и чтения. При отсутствии указанного файла он создается.
- «a+» — для продолжения записи с созданием файла при его отсутствии.
Как видно, если поставить знак «+», то при отсутствии файла в указанном пути, он будет автоматически создан интерпретатором, а имя он получит из первого параметра функции. Если не поставить плюс, то при отсутствии файла функцией будет возвращено false.
Итак вызов функции открытия файла выглядит следующим образом: fopen(«D:\documents\files\somefile.txt», «w»);. Если файл отсутствует, то интерпретатор продолжит выполнять скрипт. Но можно прервать его работу и вывести ошибку. Для этого предусмотрена конструкция ordie(«Произвольный текст об ошибке»).
Рассмотрим на примере:
fopen(«D:\documents\files\somefile.txt», «w») ordie(«Такого файла не существует, смените режим открытия или создайте файл самостоятельно»);
fclose(«D:\documents\files\somefile.txt»); // Закрываем файл, чтобы экономить аппаратные ресурсы.
Не обязательно писать строковой путь к файлу. Проще сохранить его в переменную, чтобы при открытии, закрытии и чтении не писать весь путь целиком.
Чтение данных из файла
Есть несколько функций для чтения данных из файла:
- fgets() — построчное чтение, функция возвращает дескриптор файла и строку, которая была вычитана. При следующем вызове функции, считываться будет следующая строка после предыдущей.
- file_get_contents() — считывает сразу весь файл.
- fread() — считывает часть информации из файла, размер которой определяется параметром.
Рассмотрим пример:
$file = fopen(«somehing.php», ‘r’) ordie(«Не получилось открыть файл ввиду его отсутствия»);
while(!feof($file)) // feof указывает о том, что каретка достигла конца файла
{
$str = htmlentities(fread($file, 600));
echo $str;
}
fclose($file);
После отработки цикла, будет выведено информации на 600 байт. Функция fread() принимает два параметра. Первый — это открытый файл и строковой путь к нему. Второй количество байт, которые нужно вычитать. После того, как часть байтов будет считана, указатель останавливается на том месте, где был считан последний байт.
Как записывать байты или текст в файл?
Аналогом функции для чтения в PHP присутствует функция для записи fwrite(). Она осуществляет запись указанной в параметр строки.
Пример:
$file = fopen(«D:\documents\files\somefile.txt», ‘w’) ordie(«Не получилось открыть файл ввиду его отсутствия»);
$str = «Привет, как дела?»;
fwrite($file, $str);
fclose($file);
В начале файла будет записана строка «»Привет, как дела?». Также мы можем использовать функцию fputs(), которая работает аналогично fwrite() и принимает те же параметры.
Манипуляция с указателем файла
Если указан режим открытия файла без знака «+», то каретка файла устанавливается в его начало. Считывание данных сопровождается перемещением каретки до конца числа указанных байтов или в конец файла. Но, неужели нельзя установить каретку в желаемое место? К счастью в PHP предусмотрена такая функция и называется она fseek().
Синтаксис данной функции следующий:
fseek(str $file , int $offset , int $offset_way = SEEK_SET/SEEK_CUR/SEEK_END);
Первый параметр является строковым литералом и описывает путь к файлу, второй параметр указывает на сколько позиций должна быть смещена каретка относительно текущей позиции. Третий параметр необязательный может получить только одну из 3-х предопределенных констант:
- SEEK_SET устанавливает каретку в начало файла,
- SEEK_CUR — смещение осуществляется с текущей позиции,
- SEEK_END — смещение будет происходить с конца файла.
То есть, каретка устанавливается в начало файла, конец или остается в текущей позиции, с этого положения и осуществляется смещение параметром offset.
Пример:
$file = fopen(«D:\documents\files\somefile.txt», ‘w+’) ordie(«Нельзя открыть несуществующий файл»);
$str = «Helloeverybody!»; // строка, которую запишем в файл
fwrite($file, $str); // запишем строку в начало
fseek($file, 0); // поместим каретку в начало
fwrite($file, «Haw are you?»); // Записываем в начало
fseek($file, 0, SEEK_END); // поместим указатель в конец
fwrite($file, $str); // Добавим к существующей записи еще одну, ту, что мы инициализировали в начале программы
fclose($fd); // Закрываем файловый поток
Полезные функции для манипуляции с файлами и каталогами
Набор функций для манипуляций с файлами не ограничивается только лишь записью и чтением. Есть еще ряд функций, расширяющих возможности программиста.
Перемещение файла по директориям
Функция rename(from, to) осуществляет перемещение файла в другую директорию.
Переместим файл из каталога D:\documents\files\somefile.txt в D:\documents:
if (!rename(«D:\documents\files\somefile.txt», «D:\documents\files\somefile.txt»))
echo » При перемещении возникла ошибка»;
elseecho «Файл был успешно перемещен»;
// Первый параметр функции получает текущую директорию перемещаемого файла, второй определяет место его перемещения
Копирование файла
За копирование файлов отвечает функция copy(from, to). В первом параметре мы указываем директорию и имя текущего файла, во втором параметре указываем место копирования файла, имя другого файла, куда будет скопирован контент.
Пример:
if (copy(«D:\documents\files\somefile.txt», «D:\documents\copy.txt»))
echo «Копирование файла прошло успешно»;
elseecho «Файл не скопирован»;
Удаление файла
Для удаления файла в PHP предусмотрена функция unlink(f). Она принимает единственный строковой параметр, который указывает директорию и имя файла, который следует удалить.
Пример:
if (unlink(«D:\documents\copy.txt»))
echo «Файл успешно удален»;
elseecho «Ошибка! Файл не был удален»;
Подведем итоги
Здесь были рассмотрены основные возможности PHP для манипуляций с содержимым файлов. Файл можно записывать, открывать, считывать из него данные, удалять, копировать. Чтение осуществляется построчно, кусками, и всего файла. Указатель файла можно установить в любую точку.
Что не было рассмотрено: Создание директорий. Хоть мы и создавали путь к файлу самостоятельно или прописывал путь для его открытия, язык PHP обладает богатым функционалом для манипуляций с директориями. Можно создавать директории, создавать новые папки, удалять их, переименовывать и другое.
Созданная дирректория станет частью программы и ее нельзя будет потерять без использования функций. Это как константа, которая фиксируется и не меняется. В этой директории мы можем автоматизировать функционал управления файлами, что является надежным механизмом для работы скрипта сайта.
Конечно файл не является хорошим способом хранения важных данных. К примеру при создании скрипта, который оперирует с данными пользователей, лучше воспользоваться базой данных. Однако файл позволяет хранить крупные данные, сохраняет их и обеспечивает постоянный доступ. Манипулировать можно как с текстовыми, так и файлами других форматов. Так как PHP не строго типизированный язык, интерпретатор сам определяет какие данные будут идти через файловый поток.
Спасибо за примеры. Они мне очень помогли в коде моего скрипта разобраться.
Крутая информация. Скажите, а вы можете такие же советы написать по работе с файлами в c++ А то нам в институте задали, а я даже не знаю, с чего начать.
Добрый день, Александр. В ближайшее время подготовим и опубликуем.