Работа с файлами

Работа с файлами включает в себя 3 этапа.
-Открытие файла;
-Обработка (чтение, запись);
-Закрытие файла.
Открытие файла осуществляет функция fopen(). Ей необходимо передать два параметра: первый - имя файла (строка), второй - режим (тоже строка). Возвращает функция значение типа Ресурс. В дальнейшем оно будет использоваться другими функциями, работающими с файлами.

$fp = fopen('counter.txt', 'r');

Согласно документации PHP выделяют следующие виды режимов файлов:

r – открытие файла только для чтения.
r+ - открытие файла одновременно на чтение и запись.
w – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.
w+ - аналогичен r+, только если на момент вызова фай такой существует, его содержимое удаляется.
a – открывает существующий файл в режиме записи, при этом указатель сдвигается на последний байт файла (на конец файла).
a+ - открывает файл в режиме чтения и записи при этом указатель сдвигается на последний байт файла (на конец файла). Содержимое файла не удаляется.

Примечание: в конце любой из строк может существовать еще один необязательный параметр: b или t. Если указан b, то файл открывается в режиме бинарного чтения/записи. Если же t, то для файла устанавливается режим трансляции перевода строки, т.е. он воспринимается как текстовый.

Если файл находится в текущей директории, то достаточно указать только его имя (без пути). Если же он находится в другом месте, нужно указать полый путь. Для смены текущей директории используется функция chdir(). Ей необходимо сообщить имя каталога, который мы хотим сделать текущим. Если сменить каталог не удастся, функция вернет false.
Чтобы узнать какой каталог текущий в данный момент, используйте getcwd().

Манипуляции с данными файла

Записывать данные в файл при помощи PHP можно при помощи функции fwrite(). Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:

<?php
$fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи
$mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка
$test = fwrite($fp, $mytext); // Запись в файл
if ($test) echo 'Данные в файл успешно занесены.';
else echo 'Ошибка при записи в файл.';
fclose($fp); //Закрытие файла
?>

Для построчного считывания файла используют функцию fgets(). Функция принимает 2 обязательных параметра. Первый параметр - указатель на ресурс. Тот самый, который нам вернула функция fopen(). Второй параметр - необязательный - количество байт, которое необходимо считать. Функция считывает указанное количество байт, либо меньше, если раньше встретит конец строки или конец файла. Возвращает она считанную строку.

<?php
$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while (!feof($fp))
{
$mytext = fgets($fp, 999);
echo $mytext."<br />";
}
}
else echo "Ошибка при открытии файла";
fclose($fp);
?>

Рассмотрим еще несколько функций, осуществляющих работу с файлом.

file_get_contents() принимает имя файла и возвращает его содержимое одной строкой.
file() принимает имя файла и возвращает его содержимое в виде массива строк.
При использовании двух последних функций открывать файл функцией fopen() не надо. Они сами всё сделают.
Для записи в файл используются следующие функции:
fputs(). Первый параметр - указатель на ресурс, второй - строка, которую мы записываем.
file_put_contents() принимает строку - имя файла и строку, которую необходимо записать.

Закрывает файл функция fclose(). Ей нужно передать указатель на ресурс.

Давайте на примере посмотрим действие этих функций. Пусть в директории /usr/tmp в файле f1.txt хранятся числа. По одному в каждой строке. Нам надо считать это число, увеличить и записать в файл f2.txt.

<?PHP
chdir('/usr/tmp');
$src = fopen('f1.txt', 'r'); // 'r' указывает функции открыть файл для чтения
$dst = fopen('f2.txt', 'w'); // 'w' указывает функции открыть файл для записи
while ( !feof($src) ) {
  $line = fgets($src, 16);
  $line++;
  fputs($dst, $line);
}
fclose($dst);
fclose($src);
?>

Здесь вы увидели новую функцию feof() которая возвращает true если после очередной операции достигнут конец файла.