PHP/Работа с файлами
Открытие файла
правитьПеред тем как проводить какие-либо действия с данными, хранящимися в файле, необходимо сначала открыть данный файл. Для открытия файлов в PHP определена функция fopen(). Она имеет следующее определение: fopen(string $filename, string $mode). Первый параметр представляет путь к файлу, второй - режим открытия.
Параметр $mode может принимать следующие значения:
Значение $mode | Режим открытия файла |
---|---|
'r' | Файл открывается только для чтения |
'r+' | Файл открывается только для чтения с возможностью записи |
'w' | Файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создается |
'w+' | Файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создается |
'a' | Файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается |
'a+' | Файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается |
Результатом функции fopen будет являться дескриптор файла, используемый для операций с файлом и для его закрытия.
Пример:
$fp = fopen('myfile.txt', 'r'); //открытие файла myfile.txt только для чтения
Действия с данными
правитьФункция fgets
правитьФункция fgets читает строку из файлового указателя и имеет следующий вид fgets($fp, [$length]). Параметр $fp - дескриптор ранее открытого функцией fopen() файла, из которого будет производиться чтение данных. Параметр $length является необязательным, и позволяет задать количество байт, которое требуется прочитать. Чтение заканчивается по достижении length - 1 байт, если встретилась новая строка (которая включается в возвращаемый результат) или конец файла (что встретилось первым). Если длина не указана, чтение из потока будет продолжаться до тех пор, пока не достигнет конца строки.
Пример:
<?php
$fp = fopen("myfile.txt", "a"); // Открываем файл в режиме записи при этом указатель сдвигается на последний байт файла
while (!feof($fp)) { // Пока конец файла не достигнут
$ftext = fgets($fp, 4096); // Прочитать строку из файла
echo $ftext.""; // Вывод прочитанной строки
}
fclose($fp); //Закрытие файла
?>
В данном примере демонстрируется механизм построчного чтения данных из файла. В условиях цикла используется функция feof($f), которая возвращает true, если указатель файла указывает на конец файла или произошла ошибка, иначе возвращает false. Также встречается функция закрытия файла - fclose($f), которая будет рассмотрена позже.
Функция fwrite
правитьФункция fwrite позволяет записать строку в файл и имеет следующий вид fwrite($fp, $data). Параметр $fp - дескриптор ранее открытого функцией fopen() файла, в который будет производиться запись. Параметр $data представляет собой строку, которая будет записана в файл.
Пример:
<?php
$fp = fopen("myfile.txt", "a"); // Открываем файл в режиме записи при этом указатель сдвигается на последний байт файла
fwrite($fp, "Bye!"); // Запись строки в конец файла
fclose($fp); //Закрытие файла
?>
Примечание: В данном случае место куда будет записана строка определяется при открытии файла, это не всегда может быть удобно.
Функция fseek
правитьФункция fseek предоставляет возможность переместить курсор в ранее открытом с помощью fopen() файле. Имеет следующий вид: fseek($fp, $offset, $whence). Параметр $fp - дескриптор ранее открытого функцией fopen() файла, в который будет производиться запись. Параметр $offset - количество байт, на которое необходимо сместить курсор. Параметр $whence может принимать одно из трёх значений:
Значения $whence | Описание |
---|---|
SEEK_SET | Устанавливает смещение в offset байт. |
SEEK_CUR | Устанавливает смещение в текущее положение плюс offset. |
SEEK_END | Устанавливает смещение в конец файла плюс offset. |
Пример:
<?php
$fp = fopen("myfile.txt", "w+"); // Открываем файл для записи
fwrite($fp, "Привет!"); // Запишем строку в начало файла
fseek($fp, 0); // Переместим указатель в начало файла(т.к. параметр $whence не задавался пользователем, то по умолчанию он равен SEEK_SET)
fwrite($fp, "Начало текста"); // Запишем в начало строку
fseek($fp, 0, SEEK_END); // Поместим указатель в конец файла(параметр $whence изменяется на SEEK_END)
fwrite($fp, "Пока!"); // Запишем в конец файла строку
fclose($fp); //Закрытие файла
?>
Функция ftruncate
правитьФункция ftruncate позволяет урезать файл до указанной длины и имеет вид: ftruncate($fp, $size). Параметр $fp - дескриптор ранее открытого функцией fopen() файла, в который будет производиться запись, при этом важно, чтобы файл был открыт для записи. Параметр $size - размер, до которого будет обрезан файл в случае если его первоначальный размер больше $size. Иначе, если первоначальный размер был меньше $size, файл будет дополнен нулевыми байтами.
Пример:
<?php
$fp = fopen("myfile.txt", "a+"); // Открываем файл для записи
ftruncate($fp,100); // Обрезаем файл до размера 100 байт
fclose($fp); // Закрытие файла
?>
Закрытие файла
правитьФункция fclose() закрывает открытый файл. Имеет следующее определение: fclose($fp). Параметр $fp - дескриптор ранее открытого функцией fopen() файла.
Пример:
$fp = fopen('myfile.txt', 'r'); //открытие файла myfile.txt только для чтения
fclose($fp); //закрытие файла
Замечание: Необходимо всегда закрывать файл после окончания работы с ним. Иначе в случае аварийного завершения выполнения скрипта данные в файле могут не сохранится. Также не использование fclose() может иметь серьезные последствия и для сервера. Например, хакер может воспользоваться открытым соединением и записать в файл вирус, не говоря уже о лишней трате ресурсов сервера.
Упражнения
править