Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

26.4. PHP: Чтение и проверка файлов

Иногда бывает просто необходимо получить параметры файла. Для чего это нужно? Например, пользователь вашей Web-странички захочет записать какой-либо файл. Если его модем не поддерживает передачу данных на быстром уровне, его всегда будет волновать размер файла. Также бывает нужно получить такую информацию, как время создания, либо просто проверить, существует ли указанный файл по тому или иному адресу.

Для этих и других аналогичных операций применяют функции:

• file(),

• readfile(),

• file_exists(),

• fileatime(),

• filectime(),

• filemtime(),

• filetype(),

• filesize().

Чтобы вызывать все строки содержимого указанного файла в массив, используют функцию file(). Она позволяет получить массив строк файла. Ее синтаксис:

array file (string filename [, int use_include_path]

Каждый элемент возвращенного массива соответствует строке файла (вместе с символом возврата строки). Параметр filename указывает путь и имя файла.

Существует также третий параметр, который является необязательным, в случае его использования вам необходимо выставить значение «1», в этом случае произойдет исследование файла в в файле конфигурации php.ini. Например:

<?php

// получение массива строк Web-страницы и его вывод $plot = file('http://www.your_domain_name.com');

while (list ($line_num, $line) = each ($plot) ) {

    echo "<b>Line $line_num:</b> ". htmlspecialchars($line) . "<br>\n";

}

?>

В этом примере произойдет вывод Web-страницы на экран браузера. Сначала каждая строка указанного файла будет помещена в массив $plot. Когда массив будет заполнен, то ввод строк файла прекратится и программа приступит к выводу содержимого этого массива в таком же порядке, как и вводила.

Если нужно вывести Web-страницу как строку, можно сделать так:

$fcontents = join(' ', file ('http://www.nessery__domain_name.com'));

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

Чтобы вывести все содержимое файла, не прибегая к каким-либо операциям, просто воспользуйтесь функцией readfile(). Она может выполнять два действия одновременно. Первое — функция производит вывод всего содержимого файла, т. е. на экране браузера автоматически появится все содержимое файла. Помимо этого данная функция возвратит целое число, равное количеству байтов, выведенных на экран браузера. Синтаксис функции readfile():

int readfile (string filename [, int use_include_path] )

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

При возникновении ошибки возвращается false и выводится сообщение об ошибке, за исключением функции, вызванной как @readfile.

Если параметр filename начинается с http:// (без учета регистра), открывается соединение HTTP к указанному серверу и текст ответа выводится на стандартное устройство вывода. Поскольку редиректы HTTP не обрабатываются, нужно включать в указание директории завершающие слеши.

Если параметр filename начинаетсяс учета открывается ftp-соединение с указанным сервером и файл ответа отображается на стандартном устройстве вывода.

Если сервер не поддерживает режим пассивного то вызов завершится ошибкой.

Если filename начинается как-нибудь иначе, будет открыт файл файловой системы и его содержимое выведется на стандартное

Приведем пример:

<?php

$bites = readfile ("Z:\\home\\localhost\\www\\newname. txt");

echo "<br>Количество прочитанных байтов, содержащихся в файле, равно $bites";

?>

С учетом ранее созданного файла newname.txt пример выведет следующий результат:

Добро пожаловать в новый виртуальный мир

Количество прочитанных байтов, содержащихся в файле, равно 40

Теперь, получив это значение, вы без проблем можете производить работу над ним, изменяя, как вам необходимо.


СОВЕТ

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


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

bool file_exists (string filename)

Функция возвращает значение, равное true, если указанный файл существует, в противном случае — false. На месте параметра filename указывается путь к проверяемому файлу. Например:

<?php

if (!file_exists("Z:\\home\\localhost\\www\\newname.txt"))

    echo "Ошибка! Указанный файл по этому пути не существует";

else

    echo "Указанный файл существует!";

?>

Указанный файл существует, следовательно, результатом выполнения этого скрипта будет строка:

Указанный файл


ВНИМАНИЕ

Функция file_exists() не производит проверку файлов на удаленном Web-сервере. Для правильной проверки файла он должен существовать на том сервере, на котором происходит выполнение скрипта, т. е. файл со скриптом должен быть на том же сервере, что и проверяемый файл.


Иногда помимо того, чтобы получить содержимое файла, нужно иметь доступ к его характеристикам.

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

Чтобы получить время последнего обращения к файлу, используют функцию fileatime(). Ее синтаксис:

int fileatime (string filename)

Функция возвращает значение времени последнего обращения к файлу, в случае какой-либо ошибки выдает false. Возвращаемое время выглядит, как в Unix timestamp. Результат этой функции записывается в хэш.

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


ВНИМАНИЕ

Время последнего обращения к файлу (atime) изменяется всякий раз, когда происходит чтение содержимого файла. Регулярное обращение к очень большому количеству файлов и каталогов может быть очень дорогостоящим, так как Интернет пока не бесплатный. На некоторых файловых системах Unix модификации последнего времени обращения (atime) могут быть отключены. Это сделано для того, чтобы увеличить рабочие характеристики и быстродействие таких приложений, как, например, USENET. На таких файловых системах функция fileatime() не будет работать.


Чтобы получить время последнего изменения файла, в РНР существует функция filectime(). По принципу работы и способу задания параметров эта функция аналогична fileatime(). Ее синтаксис:

int filectime (string filename)

Функция возвращает значение времени последнего изменения файла в форме Unix timestamp. В случае возникновения какой-либо ошибки функция возвращает false. Filectime() используется только для операционных систем Unix.


ВНИМАНИЕ

В большинстве файловых систем Unix файл является измененным, когда его изменены, т. е. тогда, когда разрешение, владелец, группа или другие мета-данные от inode-файла изменены.

В некоторых документациях по Unix упоминается, что время последнего изменения файла (ctime) имеет значение как время создания файла. Это неверно.


Для получения времени модификации файла в РНР для всех операционных систем, кроме Unix, существует функция filemtime(). Ее синтаксис:

int filemtime (string filename)

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

Приведем пример:

fileatime("Z:\\home\\localhost\\www\\newname.txt");

filectime("Z:\\home\\localhost\\www\\newname.txt");

filemtime("Z:\\home\\localhost\\www\\newname.txt");

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

Чтобы получить тип файла, необходимо воспользоваться функцией filetype(). Ее синтаксис:

string filetype (string filename)

Функция filetype() позволяет возвращать тип файла, т. е. она будет возвращать одно из значение: fifo, char, dir, block, link, file и unknown.

В случае возникновения какой-либо ошибки функция вызовет значение false.

Результат функции сохраняется в хэше.

Так же, как и описанные функции получения времени, функция filetype() не распространяется на удаленные файлы (remote files).

Функция filesize() определяет размер файла. Ее синтаксис:

int filesize(string filename)

Функция filesize() возвращает целое число, равное количеству байтов, содержащихся в файле.

Описанные функции используются в РНР 3 и РНР 4.

<< Предыдущий параграф Следующий параграф >>
Оглавление