Оглавление

25.2. Функции для работы с файлами.

Создание файла, запись в файл, вывод содержимого файла в список

 

Рассмотрим основные функции для работы с файлами.

□ fopen(<Путь к файлу>, <Режим>[, <Путь поиска>[, <HTTP­ заголовки>]]) открывает файл и возвращает дескриптор (идентифика­тор). Параметр <Режим> может принимать следующие значения:

  • • r — только чтение. После открытия файла указатель устанавливается на начало файла. Если файл не существует, функция fopen() вернет false;
  • • r+ — чтение и запись. После открытия файла указатель устанавлива­ется на начало файла. Если файл не существует, функция fopen() вернет false;
  • • w — запись. Если файл не существует, то он будет создан. Если файл существует, то он будет перезаписан. После открытия файла указа­тель устанавливается на начало файла;
  • • w+ — чтение и запись. Если файл не существует, то он будет создан. Если файл существует, то он будет перезаписан. После открытия файла указатель устанавливается на начало файла;
  • • a — запись. После открытия файла указатель устанавливается на ко­нец файла. Если файл не существует, функция fopen() вернет false;
  • • a+ — чтение и запись. После открытия файла указатель устанавлива­ется на конец файла. Если файл не существует, то он будет создан. Содержимое файла не удаляется.
  • Кроме того, после режима может следовать модификатор:
  • b — файл будет открыт в бинарном режиме (по умолчанию);
  • t — файл будет открыт в текстовом режиме.

 

□ flock(<Дескриптор>, <Режим>[, <Результат операции>]) позволяет блокировать файл или снять блокировку. Параметр <Режим> может при­нимать следующие значения:

  • LOCK_SH или 1 — разделяемый доступ для чтения. Если другой про­цесс хочет записать что-либо в файл, то ему придется подождать сня­тия блокировки;
  • LOCK_EX или 2 — монопольный режим для записи. Файл не доступен для совместного использования;
  • LOCK_UN или 3 — снимает блокировку.

 

□ fread(<Дескриптор>, <Длина в байтах>) позволяет прочитать из файла строку указанной длины. Если функции не удалось прочесть заданное число байтов, то она возвратит то, что удалось прочитать.

□ fgets(<Дескриптор>[, <Длина в байтах>]) позволяет считывать из фай­ла по одной строке за раз. Считывание будет выполняться до тех пор, по­ка не встретится символ новой строки (\n), символ конца файла или из файла не будет прочитано указанное количество байт.

□ file(<Путь к файлу>[, <Режим>[, <HTTP-заголовки>]]) читает весь файл в массив, каждый элемент которого будет равен одной строке, про­читанной из файла. В параметре <Режим> могут быть указаны следующие значения:

  • • FILE_USE_INCLUDE_PATH — поиск файла будет осуществлен в катало­гах, перечисленных в директиве include_path;
  • • FILE_IGNORE_NEW_LINES — не добавлять символ новой строки в конец элемента массива;

• FILE_SKIP_EMPTY_LINES — игнорировать пустые строки.

□  readfile(<Путь к файлу>[, <true | false>[, <HTTP-заголовки>]])

открывает файл и выводит все его содержимое в окно Web-браузера. Ес­ли во втором параметре указано значение true, то поиск файла будет осуществлен в каталогах, перечисленных в директиве include_path.

□ file_get_contents(<Путь к файлу>[, <Флаг>[, <HTTP-заголовки>[, <Начальная позиция>[, <Максимальная длина>]]]]) возвращает содер­жимое файла в виде строки. В отличие от функции readfile() не выво­дит содержимое файла в окно Web-браузера. Если в параметре <Флаг> указано значение FILE_USE_INCLUDE_PATH, то поиск файла будет осуще­ствлен в каталогах, перечисленных в директиве include_path.

□ fwrite(<Дескриптор>, <Строка>) записывает данные в файл.

□ fflush(<Дескриптор>) записывает изменения из буфера ввода/вывода на диск. Используется при обработке файлов большого объема, так как обычно запись на диск производится только при закрытии файла.

□ fclose(<Дескриптор>) закрывает файл.

□  file_put_contents() записывает данные в файл. Если файл не существу­ет, то он будет создан. Если файл существует, то по умолчанию он будет перезаписан. Для записи в конец файла следует указать флаг FILE_APPEND. Вызов функции эквивалентен последовательности вызовов функций fopen(), fwrite() и fclose(). Формат функции:

file_put_contents(<Путь к файлу>, <Данные>[, <Флаг>[, <HTTP-заголовки>]])

В параметре <Флаг> могут быть указаны следующие значения (или их комбинация):

  • FILE_USE_INCLUDE_PATH — поиск файла будет осуществлен в катало­гах, перечисленных в директиве include_path;
  • FILE_APPEND — если файл существует, то данные будут добавлены в конец содержимого файла;
  • LOCK_EX — монопольный режим для записи. Файл не доступен для совместного использования.

 

Пример:

// Перезапись файла
file_put_contents('test.txt', 'Эти данные будут записаны');
// Добавление в конец
file_put_contents('test.txt', "\nА эти данные будут добавлены", 
                  FILE_APPEND);

Для примера создадим файл file.txt и запишем в него пять E-mail адресов по одному на строчке (листинг 41).

 

Листинг 41. Создание файла и запись в него

<?php
@$file = fopen("file.txt", "a+") or die("Ошибка");
$mail = "mail1@site.ru\nmail2@site.ru\nmail3@site.ru\n";
$mail .= "mail4@site.ru\nmail5@site.ru";
flock($file, LOCK_EX);
fwrite($file, $mail);
flock($file, LOCK_UN);
fclose($file);
echo "Файл создан";
?>

 

Если в процессе создания файла возникнет ошибка, то она будет подавлена оператором @, а в окне Web-браузера будет выведено сообщение "Ошибка". При этом дальнейшая обработка файла будет остановлена.

 

Теперь добавим новую запись в конец файла (листинг 42).

 

Листинг 42. Добавление новой записи в конец файла

<?php
@$file = fopen("file.txt", "a+") or die("Ошибка");
$mail = "\nmail6@site.ru";
flock($file, LOCK_EX);
fwrite($file, $mail);
flock($file, LOCK_UN);
fclose($file);
echo "Операция произведена";
?>

 

А теперь выведем содержимое файла в список (листинг 43).

 

Листинг 43. Вывод содержимого файла в список

<?php
@$file = fopen("file.txt", "r");
if ($file) {
   flock($file, LOCK_SH);
   echo "<select>\n";
   while(!feof($file)) {
      echo '<option>', trim(fgets($file, 200)), '</option>';
   }
   echo "</select>\n";
   flock($file, LOCK_UN);
   fclose($file);
}
else {
   echo "Не удалось открыть файл";
}
?>
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити