|
open().
Если файл открыт в режиме бинарного чтения/записи, то PHP совершенно все равно,
что вы читаете или пишете. Вы можете совершенно спокойно считать содержимое
какого-нибудь бинарного файла (например, GIF-рисунка) в обычную строковую пе-
ременную, а потом записать эту строку в другой файл, и при этом информация нис-
колько не исказится. Правда, при чтении текстового файла в Windows вы получите
символы \r\n в конце строки вместо одного \n, если не предпримете некоторых
дей-
ствий, а откроете файл, как об этом написано в документации. Об этом речь ниже.
Открытие файла
Как и в Си, работа с файлами в PHP разделяется на три этапа. Сначала файл
откры-
вается в нужном режиме, при этом возвращается некое целое число, служащее иден-
тификатором открытого файла (дескриптор файла). Затем настает очередь команд
работы с файлом (чтение или запись, или и то и другое), причем они "привязаны"
уже
к дескриптору файла, а не к его имени. После этого файл лучше всего закрыть
(хотя
это можно и не делать, поскольку PHP автоматически закрывает все файлы по
завер-
шении сценария).
int fopen(string $filename, string $mode, bool $use_include_path=false)
Открывает файл с именем $filename в режиме $mode и возвращает дескриптор от-
крытого файла. Если операция "провалилась", то, как это принято, fopen()
возвра-
щает false. Впрочем, мы можем не особо беспокоиться, проверяя выходное значе-
Часть IV. Стандартные функции PHP 246
ние на ложность — вполне подойдет и проверка на ноль, потому что дескриптор 0 в
системе соответствует стандартному потоку ввода, а он, очевидно, никогда не
будет
открыт функцией fopen() (во всяком случае, пока не будет закрыт нулевой
дескрип-
тор, а это делается крайне редко). Необязательный параметр $use_include_path
говорит PHP о том, что, если задано относительное имя файла, его следует искать
также и в списке путей, используемом инструкциями include и require. Обычно
этот параметр не используют.
Параметр $mode может принимать следующие значения:
r r — файл открывается только для чтения. Если файла не существует, вызов реги-
стрирует ошибку. После удачного открытия указатель файла устанавливается на
его первый байт, т. е. на начало;
r r+ — файл открывается одновременно на чтение и запись. Указатель текущей
позиции устанавливается на его первый байт. Как и для режима r, если файла не
существует, возвращается false. Следует отметить, что если в момент записи
указатель файла установлен где-то в середине файла, то данные запишутся прямо
поверх уже имеющихся, а не "раздвинут" их, при необходимости увеличив размер
файла. Будьте внимательны;
r w — создает новый пустой файл. Если на момент вызова уже был файл с таким
именем, то он предварительно уничтожается. В случае неверно заданного имени
файла вызов, как нетрудно догадаться, "проваливается";
r w+ — аналогичен r+, но если файла изначально не существовало, создает его.
По-
сле этого с файлом можно работать как в режиме чтения, так и записи. Если файл
существовал до момента вызова, его содержимое удаляется;
r a — открывает существующий файл в режиме записи, и при этом сдвигает указа-
тель текущей позиции за последний байт файла. Этот режим полезен, если требу-
ется что-то дописать в конец уже имеющегося файла. Как водится, вызов неуспе-
шен в случае отсутствия файла;
r a+ — открывает файл в режиме чтения и записи, указатель файла устанавливается
на конец файла, при этом содержимое файла не уничтожается. Отличается от a
тем, что если файла изначально не существовало, то он создается. Этот режим по-
лезен, если вам нужно что-то дописать в файл (например, в журнал), но вы не
знаете, создан ли уже такой файл;
Но это еще не полное описание параметра $mode. Дело в том, что в конце любой из
строк r, w, a, r+, w+ и a+ может находиться еще один необязательный символ — b
или t. Если указан b (или не указан вообще никакой), то файл открывается в
режиме
бинарного чтения/записи. Если же это t, то для файла устанавливается режим
транс-
ляции символа перевода строки, т. е. он воспринимается как текстовый.
Глава 15. Р
|
|