После авторизации Вы получите доступ к файлам, скрытым материалам сайта, исходным кодам
возможность комментировать и т.д.

Вы можете авторизоваться на сайте всего одним кликом:

2016-07-09
Основы PHP → Работа с файлами
PHP, Добавить файл, Редактировать файл, Записать в файл

В этом уроке я покажу как работать с файлами системы с помощью PHP. Вы научитесь читать содержимое файлов, записывать данные, а также проводить другие операции.

Особенности работы с файлами в PHP

При работе с файлами в PHP можно забыть о различии прямых и обратных слэшей для UNIX-систем и Windows. Вы можете писать их как угодно, интерпретатор самостоятельно преобразует путь к нужному виду. Мы рекомендуем всегда использовать прямые слэши, вот такие:
media/images/logo.png

Вы можете работать с файлами на удаленных серверах в точности так же, как и со своими собственными. Если вы предваряете имя файла строкой http:// или ftp://, то PHP "понимает", что нужно на самом деле установить сетевое соединение и работать именно с файлом с удаленного сервера. При этом при работе такой файл не будет ничем отличаться от обычного.

Два режима работы с файлом

Можно выделить два режима работы с файлом:

  1. Текстовый;
  2. Бинарный.

Первый режим предполагает, что файл состоит из печатных символов, т. е. букв, цифр и тех знаков, которые есть на клавиатуре. С текстовыми файлами обычно работают построчно, т. е. записывают и читают по одной строке. Для разделения строк используют специальные символы переноса строки.

Бинарный режим служит для работы с любыми файлами. В этом случае читают и записывают не строки текста, а байты, т. е. двоичную информацию.

В PHP в обоих случаях при чтении и записи используется строковый тип данных, т. к. типа "массив байтов" здесь просто нет. Но отличие все же есть, и заключается оно в трансляции символа переноса строки.

В системах семейства UNIX для переноса строки используется символ "\n", в то время как в Windows — последовательность из двух символов "\r\n". Трансляция символа переноса строки нужна для того, чтобы программист не зависел от операционной системы. Таким образом, можно считать, что для новой строки следует всегда использовать "\n", интерпретатор сам откорректирует чтение и запись.

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

Прежде чем приступить к обзору наиболее важных функций для работы с файлами, мы должны познакомиться с понятием "дескриптор файла". Дескриптор — это уникальный номер, который используется для идентификации объектов во время выполнения программы. Например, если одновременно открывается несколько файлов или соединений, их требуется как-то различать друг от друга, для этого используются дескрипторы. Чтобы произвести какие-либо манипуляции с файлом, вам необходимо сообщить соответствующей функции его дескриптор. Тогда интерпретатор будет знать, над каким файлом требуется произвести то или иное действие. Теперь давайте рассмотрим наиболее популярные функции для работы с файлами.

int fopen(string $filename, string $mode, bool $use_include_path=false)

Открывает файл с именем $filename в режиме $mode и возвращает дескриптор открытого файла. Если операция "провалилась", то, как это принято, fopen() возвращает false.

Необязательный параметр $use_include_path говорит PHP о том, что, если задано относительное имя файла, его следует искать также и в списке путей, используемом инструкциями include и require . Обычно этот параметр не используют.

Параметр $mode может принимать следующие значения:

  1. r — файл открывается только для чтения. Если файл не существует, вызов регистрирует ошибку. После удачного открытия указатель файла устанавливается на его первый байт, т. е. на начало;
  2. r+ — файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на его первый байт. Как и для режима r , если файл не существует, возвращается false ;
  3. w — создает новый пустой файл. Если на момент вызова уже был файл с таким именем, то он предварительно уничтожается;
  4. w+ — аналогичен r+ , но если файл изначально не существовал, создает его. После этого с файлом можно работать как в режиме чтения, так и записи. Если файл существовал до момента вызова, его содержимое удаляется;
  5. a — открывает существующий файл в режиме записи и при этом сдвигает указатель текущей позиции за последний байт файла. Этот режим полезен, если требуется что-то дописать в конец уже имеющегося файла. Вызов неудачен в слу- чае отсутствия файла;
  6. a+ — открывает файл в режиме чтения и записи, указатель файла устанавливается на конец файла, при этом содержимое файла не уничтожается. Отличается от a тем, что если файл изначально не существовал, то он создается. Этот режим полезен, если вам нужно что-то дописать в файл (например, в журнал), но вы не знаете, создан ли уже такой файл.

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

int tmpfile()

Создает новый файл с уникальным именем и открывает его на чтение и запись. В дальнейшем вся работа должна вестись с возвращенным файловым дескриптором, потому что имя файла недоступно. Функцию следует использовать, если нужен временный файл, который при завершении программы хотелось бы удалить. Пространство, занимаемое временным файлом, автоматически освобождается при его закрытии и при завершении работы программы.

int fclose(int $fp)

Закрывает файл. Возвращает истину при успехе, false при "провале". PHP автоматически закрывает открытые файлы при завершении выполнения сценария. Однако хорошим тоном считается самостоятельно закрывать дескриптор сразу после завершения работы с файлом.

string fread(int $f, int $numbytes)

Из файла $f читает $numbytes символов и возвращает строку этих символов. После чтения указатель файла продвигается к следующим после прочитанного блока позициям (это происходит и для всех остальных функций чтения и записи). Если $numbytes больше, чем можно прочитать из файла (например, раньше достигается конец файла), возвращается то, что удалось считать.

int fwrite(int $f, string $st)

Записывает в файл $f все содержимое строки $st. Эта функция составляет пару для fread(), действуя "в обратном направлении". При работе с текстовыми файлами (т. е. когда указан символ t в режиме открытия файла) все "\n" автоматически преобразуются в тот разделитель строк, который принят в вашей операционной системе.

string fgets(int $f, int $length)

Читает из файла одну строку, заканчивающуюся символом новой строки "\n". Этот символ также считывается и включается в результат. Если строка в файле занимает больше $length-1 байтов, то возвращаются только ее $length-1 символов. Функция полезна, если вы открыли файл и хотите "пройтись" по всем его строкам. Однако даже в этом случае лучше (и быстрее) будет воспользоваться функцией file() , которая рассматривается далее.

int fputs(int $f, string $st)

Эта функция — синоним fwrite(). Отличие в том, что пару fread / fwrite принято использовать при работе с бинарными файлами, а пару fputs / fgets — с текстовыми (когда запись и чтение осуществляются построчно).

int feof(int $f)

Возвращает true, если достигнут конец файла.

int fseek(int $f, in $offset, int $whence = SEEK_SET)

Устанавливает указатель файла на байт со смещением $offset (от начала файла, от его конца или от текущей позиции, в зависимости от параметра $whence ).

Параметр $whence, как уже упоминалось, задает, с какого места отсчитывается смещение $offset. В PHP для этого существуют три константы, равные соответственно 0, 1 и 2:

  1. SEEK_SET — отсчитывает позицию относительно начала файла;
  2. SEEK_CUR — отсчитывает позицию относительно текущей позиции;
  3. SEEK_END — отсчитывает позицию относительно конца файла.

В случае использования последних двух констант параметр $offset вполне может быть отрицательным (а при применении SEEK_END он будет отрицательным наверняка).

Как это ни странно, но в случае успешного завершения эта функция возвращает 0, а в случае неудачи –1. Должно быть, так сделано по аналогии с Си-эквивалентом функции.

int ftell(int $f)

Возвращает положение указателя файла. Вот так можно определить длину файла:

$f = fopen('x.txt', 'r');
fseek($f, 0, SEEK_END);
$size = ftell($f);
echo "Размер файла: $size байт";
fclose($f);
int filesize(string $filename)

Более простой способ определения размера файла.

bool file_exists(string $filename)

Возвращает true, если файл с именем $filename существует.

bool is_file(string $filename)

Возвращает true, если $filename — обычный файл.

bool is_dir(string $filename)

Возвращает true, если $filename — каталог.

string basename(string $path)

Выделяет основное имя файла из пути $path.

string dirname(string $path)

Возвращает имя каталога, выделенное из пути $path.

bool copy(string $src, string $dst)

Копирует файл с именем $src в файл с именем $dst . При этом, если файл $dst на момент вызова существовал, осуществляется его перезапись. Функция возвращает true , если копирование прошло успешно, а в случае провала — false .

bool rename(string $oldname, string $newname)

Переименовывает (или перемещает, что одно и то же) файл с именем $oldname в файл с именем $newname . Если файл $newname уже существует, регистрируется ошибка, и функция возвращает false .

bool unlink(string $filename)

Удаляет файл с именем $filename . В случае неудачи возвращает false , иначе — true .

array file(string $filename)

Считывает файл с именем $filename целиком и возвращает массив, каждый элемент которого соответствует строке в прочитанном файле. Функция работает очень быстро — гораздо быстрее, чем если бы мы использовали fopen() и читали файл по одной строке.

Неудобство этой функции состоит в том, что символы конца строки не вырезаются из строк файла, а также не транслируются, как это делается для текстовых файлов. Так что, каждый элемент массива иногда имеет смысл преобразовать с помощью функции rtrim() .

Это не полный перечень функций для работы с файлами, однако на первое время их более чем достаточно. Если вам потребовалось что-то сделать с файлом и вы не нашли в приведенном выше списке нужной функции, обратитесь к справочнику! Наверняка такая функция уже есть в PHP.

В следующем уроке мы закрепим полученные знания с помощью практики, а именно - сделаем журнал посещений сайта.

558
0
Пожалуйста, авторизируйтесь, чтобы скачать архив с файлами урока