PHP/Работа с файлами

Материал из Викиверситета
< 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() может иметь серьезные последствия и для сервера. Например, хакер может воспользоваться открытым соединением и записать в файл вирус, не говоря уже о лишней трате ресурсов сервера.

Упражнения[править]

1 Какая функция предоставляет возможность считать данные из файла?

fopen()
fgets()
fwrite()
fseek()
ftruncate()
fclose()

2 Ученик хотел прочитать файл функцией fgets() и написал следующую программу. Почему данный скрипт не даст нужного результата?

<?php
while (!feof($FileDescriptor)) {
    $ftext = fgets($fp, 4096);
    echo $ftext.""; 
} //
fclose($fp);
?>

Параметры функций feof() и fclose() не совпадают
В качестве параметра функций feof(), fgets() и fclose() должен использоваться дескриптор открытого файла - файл не открыт
Вместо fgets() должна быть использована функция ftruncate()

3 Какая функция позволяет записать строку в файл?

fopen()
fgets()
fwrite()
fseek()
ftruncate()
fclose()

4 Какая функция позволяет открыть файл?

fopen()
fgets()
fwrite()
fseek()
ftruncate()
fclose()

5 Что допускается написать в данном скрипте вместо знака вопроса?

<?php
$fp = fopen("myfile.txt", "?"); 
ftruncate($fp,100); 
fclose($fp); 
?>

a+
h-
w+
r

6 Какая функция позволяет закрыть файл?

fopen()
fgets()
fwrite()
fseek()
ftruncate()
fclose()

7 Какая функция позволяет урезать файл до заданной длины?

fopen()
fgets()
fwrite()
fseek()
ftruncate()
fclose()

8 Что может повлечь за собой игнорирование необходимости закрытия файла?

В случае аварийного завершения выполнения скрипта данные в файле могут не сохранится
Поломка компьютера, на котором был написан скрипт
Хакер может воспользоваться открытым соединением и записать в файл вирус
Трата ресурсов сервера

9 Какая функция предоставляет возможность переместить курсор?

fopen()
fgets()
fwrite()
fseek()
ftruncate()
fclose()