[php] – Введение в работу с файлами

advertisement
[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 год.
Download