[php] – Введение в работу с файлами. Автор: Dexter. (c) 2005 г. Введение. В данной статье я хотел бы изложить основы работы с текстовыми файлами, которые так порой требуются начинающему, да и более опытному Web программисту. Очень хотелось бы, чтобы данная статья послужила хорошим уроком в освоении языка php. Далее хочу сразу сказать, что статья предназначена для пользователей, знающих Основы языка php, такие как Функции (хотя бы представление о них), циклы условия операции, работа с переменными. Если вы хотя бы средне знаете данный материал, то данная статья вам будет полезна, в противном случае рекомендую вам изучить базовые основы языка, которые можно найти в любом справочнике по php. В данной статье будут описываться операции открытия, чтения, записи и закрытия файла. Операции открытия и закрытия файла. Теперь приступим непосредственно к операциям чтения, открытия, записи и соответственно закрытия файлов. Первой функцией, которую мы рассмотрим, будет функция fopen(); ее синтаксис таков: [code] int fopen(string $filename, string $mode, bool $use_include_path=false); [/code] Знающему человеку не трудно понять, что функция возвращает целое число, а первые 2 аргумента, строковые. Третий аргумент указывает на то что открываемый файл следует искать так же в директориях загружаемых функциями include, и require; его обычно опускают. В общем случае мы будем использовать функцию так: [code] $f = fopen($filename,$mode); [/code] Теперь на данном примере можно сразу рассмотреть все, что происходит при вызове этой функции и что она возвращает. В переменную $f сохраняется дескриптор файла, его уникальный номер, который будет использоваться далее при записи, а так же чтении из файла. Далее переменная $filename определяет имя файла, а переменная $mode режим открытия файла. Теперь я приведу описание режимов открытия файла и напишу исходный код, для открытия и последующего закрытия файла. Для справки не будем углубляться в подробности, для закрытия файла используется функция [code] fclose($f); [/code] Где $f как вы наверное догадались это дескриптор ранее открытого файла. Ну все таки перейдем к режимам открытия файла. r – Файл открывается только для чтения, и если такового не существует, вызов функции регистрирует ошибку. После удачного открытия указатель файла устанавливается на его первый байт, т.е. в начало файла. r+ - Файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на его первый байт. Если файла не существует, возвращает false. Следует отметить, что если в момент записи указатель файла установлен где–то в середине файла, то данные запишутся прямо поверх уже имеющихся, а не «раздвинут» их, при необходимости увеличив размер файла. Будьте внимательны. w - Создает новый пустой файл. Если на момент вызова уже был файл с таким именем, то он предварительно уничтожается. В случае неверно заданного имени файла вызов, как нетрудно догадаться «Проваливается». w+ - аналогичен r+ , но ели файла изначально не существовало, создает его. После этого с файлом можно работать, как в режиме чтения, так и в режиме записи. Если файл существовал во время вызова, его содержание удаляется. a – открывает существующий файл в режиме записи, и при этом сдвигает указатель текущей позиции на последний байт файла. Этот режим полезен, если требуется что-то дописать в конец уже имеющегося файла. Как водится, вызов не успешен, в случае отсутствия файла. a+ - Открывает файл в режиме чтения и записи, указатель файла устанавливается на конец файла, при этом содержание файла не уничтожается. Отличается от a тем, что если изначально файла не существовало, то он создается. Этот режим полезен, если вам нужно что-то дописать в файл, но вы не знаете, создан уже такой файл; Но это еще не полное описание параметра $mode. Дело в том, что в конце любой из строк r, w, a, r+, w+, a+ может находиться еще один необязательный символ b или t. Если указан b (или не указан вообще никакой), то файл открывается в режиме бинарного чтения/записи. Если же это t, то для файла устанавливается режим трансляции символа перевода строки, т.е. он воспринимается как текстовой. Теперь вы знаете все о открытии и закрытии файлов, можно привести простой пример для того чтобы показать как с этим всем работать итак рассмотрим такой код. [code] <?php $f = fopen(“file.txt”,”w+t”); // Делаем что-то с $f fclose($f); ?> [/code] В данном примере, думаю даже человек совершенно не знающий php, поймет, что мы открываем файл file.txt в режиме w+ и дополнительно текстовом режиме, а затем его закрываем. Думаю с открытием и закрытием файла все понятно, аналогично поступают при выборе других режимов. А можно еще сделать и так [code] <?php $fliename=”file.txt”; $mode = “w+t”; $f = fopen($filename, $mode); // Делаем что-то с $f fclose($f); ?> [/code] Теперь если вы запустите один из сценариев, и файла не будет существовать, вы увидите, что файл создастся в папке, где вы запустили сценарий, или если файл существовал, и в нем находились какие то данные, он станет пустым. Вот теперь можно перейти к чтению из файла и записи в файл. Думаю, любой пользователь понял эту часть статьи. Чтение из файла, и запись в файл. Теперь мы уже знаем, как работать с файлами а точнее открывать и закрывать их, и нам можно приступить к изучению функций для чтения и записи в файл. Первая из них будет функция. [code] string fread(int $f, int $numbytes); [/code] Функция читает из файла $f, $numbytes символов и возвращает строку этих символов. После чтения указатель файла продвигается к следующим после прочитанного блока позициям. (Это происходит и для всех остальных функций) Разумеется, если $numbytes больше, чем можно прочитать из файла, возвращется то, что удалось считать. Этот прием можно использовать, если вам нужно считать файл в строку целиком. Для этого просто задайте в $numbytes очень большое число, (например 100000). Но если вы заботитесь об экономии памяти в системе, так поступать не рекомендуется. Дело в том, что в некоторых версиях php передача большой длинны строки во втором параметре fread() вызывает первоначальное выделение памяти, в соответствии с запросом. Конечно потом лишняя память освобождается, но все же ее может не хватить для начального выделения. В этом случае можно использовать функцию filesize($filename) которая возвращает размер файла. В общем случае мы будем испоьзовать данную функцию чтения из файла примерно так. [code] $text = fread($f,99999); [/code] Или так, для экономии памяти. [code] $size = filesize( “file.txt” ); $text = fread($f, $size); [/code] Нетрудно догадаться, что перед тем как читать из файла, его нужно открыть, а после действий с файлом, обязательно закрыть. Ну, пока что давайте рассмотрим данные мной высшее примеры, а уже потом посмотрим на конкретном примере, как функция работает. В первом примере при вызове функции она читает из файла $f 99999 символов, и возвращает результат в строку $text. После ее вызова с строке $text у вас будет находиться содержание файла. Во втором примере делается то же самое, только тут мы сперва определяем размер файла, а затем считываем количество символов равное размеру файла. Тоесть не больше символов, чем хранится в файле. Вот теперь можно рассмотреть функцию на данном примере. Для начала создайте, в какой либо директории файл file.txt, и запишите в него какой либо текст. Затем создайте php файл, например, с именем files.php и напишите в нем следующий код. [code] <?php $f = fopen(“file.txt”,”wt”); $text = fread($f, 9999999); fclose($f); echo $text; ?> [/code] В данном примере все в принципе просто и понятно. Сперва мы открываем файл file.txt затем считываем из него 999999 символов(скорее всего весь файл). Записываем результат в переменную $text. Закрываем файл, и выводим его содержимое в окно браузера. Теперь давайте рассмотрим функции для записи в файл. Это функции [code] int fwrite(int $f, string $st); int fputs(int $f, string $st); [/code] Данные две функции абсолютно идентичны, я пользуюсь первой из них. В общем случае мы будем использовать ее так. [code] fwrite($f, $st); [/code] Функция записывает в файл $f все содержимое строки $st. При работе с текстовыми файлами (то есть когда указан символ t в режиме открытия файла) все \n автоматически преобразуются в тот разделитель строк, который принят в вашей операционной системе. Теперь рассмотрим простой пример использования функции записи в файл. [code] $string = “Hello world!”; $f = fopen(“file.txt”,”wt”); fwrite($f, $string); fclose($f); [/code] Данный скрипт открывает файл file.txt, если го не существовало, то создает, если существовал, то затирает в нем все данные, и записывает туда строку $string. Далее Если вы откроете созданный файл текстовым редактором, то увидите результат записи в файл. Как видите, ничего сложного в этом нет. Далее я вкратце расскажу еще о двух функциях для чтения из файла. Эти функции на мой взгляд используются реже поэтому углубляться в них не стоит, хотя вы должны будете понять как они работают. Первая из них это функция [code] string fgets(int $f, int $length); [/code] Или как обычно используется [code] $text = fgets($f, 999); [/code] Читает из файла одну строку, заканчивающуюся символом новой строки \n. Этот символ так же считывается, и включается в результат. Если строка в файле занимает больше $length – 1 байтов, то возвращается только ее $length – 1 символов. Функция полезна, если вы открыли файл, и хотите «пройтись» по всем его строкам. Однако даже в этом случае лучше и быстрее будет воспользоваться функцией File(), которая рассматривается ниже. Стоит так же заметить, что fgets() В случае текстового режима в Windows заботится о преобразовании пар \r\n в один символ \n, так что будьте внимательны, при работе с текстовыми файлами в этой операционной системе. Ну и, наконец, последняя функция это. [code] list File(string $filename); [/code] Или же [code] $text = File(“file.txt”); [/code] Считывает файл с именем $filename целиком, и возвращает массив-список, каждый элемент которого соответствует строке в прочитанном файле. Функция работает очень быстро, гораздо быстрее, чем, если бы мы использовали fopen() и читали файл по одной строке. Неудобство этой функции состоит в том, что символы конца строки (обычно \n), не вырезаются из строк файла, а так же не транслируются, как это делается для текстовых файлов. В заключение. В данной статье я описал основные функции работы с файлами в языке php. Надеюсь, мои примеры будут вам довольно понятны. Если вы захотите узнать о функциях больше, о них можно прочитать в любом руководстве по php. Хотя лично я думаю, что этой статьи вам будет достаточно, чтобы хорошо научится обращаться с файлами. Или хотя бы изучить их основы. Используемая в статье справочная литература. 1. Котеров Д.В. Самоучитель PHP 4. – СПб.: БХВ-Петербург, 2003. – 576 c.:ил. By Dexter 2005 год.