Доступ к файлам и манипуляции с ними в 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»); // Закрываем файл, чтобы экономить аппаратные ресурсы.

Не обязательно писать строковой путь к файлу. Проще сохранить его в переменную, чтобы при открытии, закрытии и чтении не писать весь путь целиком.

Чтение данных из файла

Есть несколько функций для чтения данных из файла:

  1. fgets() — построчное чтение, функция возвращает дескриптор файла и строку, которая была вычитана. При следующем вызове функции, считываться будет следующая строка после предыдущей.
  2. file_get_contents() — считывает сразу весь файл.
  3. 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-х предопределенных констант:

  1. SEEK_SET устанавливает каретку в начало файла,
  2. SEEK_CUR — смещение осуществляется с текущей позиции,
  3. 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 не строго типизированный язык, интерпретатор сам определяет какие данные будут идти через файловый поток.

3 комментария для “Доступ к файлам и манипуляции с ними в PHP

  • 28.04.2021 в 01:30
    Постоянная ссылка

    Спасибо за примеры. Они мне очень помогли в коде моего скрипта разобраться.

  • 29.04.2021 в 07:35
    Постоянная ссылка

    Крутая информация. Скажите, а вы можете такие же советы написать по работе с файлами в c++ А то нам в институте задали, а я даже не знаю, с чего начать.

  • 03.06.2021 в 16:02
    Постоянная ссылка

    Добрый день, Александр. В ближайшее время подготовим и опубликуем.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *