Чтение и запись файлов
Открытие и закрытие файлов
Для открытия файлов в PHP определена функция fopen()
. Она имеет следующее определение: resource fopen(string $filename, string $mode)
. Первый параметр $filename
представляет путь к файлу, а второй - режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:
r
файл открывается только для чтения. Если файла не существует, возвращаетfalse
r+
файл открывается только для чтения с возможностью записи. Если файла не существует, возвращаетfalse
w
файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создаетсяw+
файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создаетсяa
файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создаетсяa+
файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается
Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.
После окончания работы файл надо закрыть с помощью функции fclose()
, которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:
$fd = fopen("form.php", 'r') or die("не удалось открыть файл");
fclose($fd);
Конструкция or die("текст ошибки")
позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen
не смогла открыть файл.
Чтение файла
Для чтения файла можно использовать несколько функций. Для построчного чтения используется функция fgets()
, которая получает дескриптор файла и возвращает одну считанную строку. Пройдем построчно по всему файлу:
<?
$fd = fopen("form.php", 'r') or die("не удалось открыть файл");
while(!feof($fd)) {
$str = htmlentities(fgets($fd));
echo $str;
}
fclose($fd);
При каждом вызове fgets()
PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof()
, которая возвращает true
при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets()
.
Чтение файла полностью
Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents()
:
<?
$str = htmlentities(file_get_contents("form.php"));
echo $str;
При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.
Поблочное считывание
Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread()
:
<?
$fd = fopen("form.php", 'r') or die("не удалось открыть файл");
while(!feof($fd)) {
$str = htmlentities(fread($fd, 600));
echo $str;
}
fclose($fd);
Функция fread()
принимает два параметра: дескриптор считываемого файла и количество считываемых байтов. При считывании блока указатель в файле становится в конец этого блока. И также с помощью функции feof()
можно отследить завершение файла.
Запись файла
Для записи файла применяется функция fwrite()
, которая записывает в файл строку:
<?
$fd = fopen("hello.txt", 'w') or die("не удалось создать файл");
$str = "Привет мир";
fwrite($fd, $str);
fclose($fd);
Аналогично работает другая функция fputs()
:
<?
$fd = fopen("hello.txt", 'w') or die("не удалось создать файл");
$str = "Привет мир";
fputs($fd, $str);
fclose($fd);
Работа с указателем файла
При открытии файла для чтения или записи в режиме w
, указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek
, которая имеет следующее формальное определение:
int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ] )
Параметр $handle
представляет дескриптор файла. Параметр $offset
- смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:
SEEK_SET
значение по умолчанию, устанавливает смещение вoffset
байт относительно начала файлаSEEK_CUR
устанавливает смещение вoffset
байт относительно начала текущей позиции в файлеSEEK_END
устанавливает смещение вoffset
байт от конца файла
В случае удачной установки указателя функция fseek()
возвращает 0, а при неудачной установке возвращает -1. Пример использования функции:
<?
$fd = fopen("hello.txt", 'w+') or die("не удалось открыть файл");
$str = "Привет мир!"; // строка для записи
fwrite($fd, $str); // запишем строку в начало
fseek($fd, 0); // поместим указатель файла в начало
fwrite($fd, "Хрю"); // запишем в начало строку
fseek($fd, 0, SEEK_END); // поместим указатель в конец
fwrite($fd, $str); // запишем в конце еще одну строку
fclose($fd);