Главная » Полезные статьи » Язык PHP » Всё о работе с файлами и каталогами
Распечатать статью

Всё о работе с файлами и каталогами

Данная глава посвящена одному из важнейших аспектов РНР — средствам файлового
ввода/вывода. Как нетрудно предположить, входные и выходные потоки данных
интенсивно используются при разработке web-приложений. Не ограничиваясь простым
чтением/записью файлов, РНР предоставляет в распоряжение программиста средства
просмотра и модификации серверной информации, а также запуска внешних программ.
Этим средствам и посвящена настоящая глава.

Проверка существования и размера файла

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

file_exists( ) и is_file( ).

file_exists( )

Функция f ilе_ехists ( ) проверяет, существует ли заданный файл. Если файл
существует, функция возвращает TRUE, в противном случае возвращается FALSE.
Синтаксис функции file_exists( ):

bool file_exists(string файл)

Пример проверки существования файла:файл

if (! file_exists ($filename)) :

print «File $filename does not exist!»;

endif:

is_file( )

Функция is_file( ) проверяет существование заданного файла и возможность
выполнения с ним операций чтения/записи. В сущности, is_file( ) представляет
собой более надежную версию file_exists( ), которая проверяет не только факт
существования файла, но и то, поддерживает ли он чтение и запись данных:

bool is_file(string файл)

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

$file = «somefile.txt»;

if (is_file($file)) :

print «The file $file is valid and exists!»;

else :

print «The file $file does not exist or it is not a valid file!»;

endif:

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

filesize( )

Функция filesize( ) возвращает размер (в байтах) файла с заданным именем или
FALSE в случае ошибки. Синтаксис функции filesize( ):

int filesize(string имя_файла)

Предположим, вы хотите определить размер файла pastry.txt. Для получения нужной
информации можно воспользоваться функцией filesize( ):

$fs = filesize(«pastry.txt»); print «Pastry.txt is $fs bytes.»;

Выводится следующий результат:

Pastry.txt is 179 bytes.

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

Открытие и закрытие файлов

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

fopen( )

Функция fopen( ) открывает файл (если он существует) и возвращает целое число —
так называемый файловый манипулятор (file handle). Синтаксис функции fopen( ):

int fopen (string файл, string режим [, int включение_пути])

Открываемый файл может находиться в локальной файловой системе, существовать в
виде стандартного потока ввода/вывода или представлять файл в удаленной системе,
принимаемой средствами HTTP или FTP.

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

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

Если параметр задан в виде php://stdin, php://stdout или php://stderr,
открывается соответствующий стандартный поток ввода/вывода.

Если параметр начинается с префикса http://, функция открывает подключение HTTP
к серверу и возвращает манипулятор для указанного файла.

Если параметр начинается с префикса ftp://, функция открывает подключение FTP к
серверу и возвращает манипулятор для указанного файла. В этом случае следует
обратить особое внимание на два обстоятельства: если сервер не поддерживает
пассивный режим FTP, вызов fopen( ) завершается неудачей. Более того, FTP-файлы
открываются либо для чтения, либо для записи.

При работе в пассивном режиме сервер ЯР ожидает подключения со стороны клиентов.
При работе в активном режиме сервер сам устанавливает соединение с клиентом. По
умолчанию обычно используется активный режим.

Если необязательный третий параметр включение_пути равен 1, то путь к файлу
определяется по отношению к каталогу включаемых файлов, указанному в файле
php.ini (см. главу 1).

Ниже приведен пример открытия файла функцией fopen( ). Вызов die( ),
используемый в сочетании с fopen( ), обеспечивает вывод сообщения об ошибке в
том случае, если открыть файл не удастся:

$file = «userdata.txt»; // Некоторый файл

$fh = fopen($file, «a+») or die(«File ($file) does not exist!»);

Следующий фрагмент открывает подключение к сайту РНР (http://www.php.net):

$site = «http://www.php.net»: // Сервер, доступный через HTTP

$sh = fopen($site., «r»); //Связать манипулятор с индексной страницей Php.net

После завершения работы файл всегда следует закрывать функцией fclose( ).

fclose ( )

Функция fclose( ) закрывает файл с заданным манипулятором. При успешном закрытии
возвращается TRUE, при неудаче — FALSE. Синтаксис функции fclose( ):

int fclose(int манипулятор)

Функция fclose( ) успешно закрывает только те файлы, которые были ранее открыты
функциями fopen( ) или fsockopen( ). Пример закрытия файла:

$file = «userdata.txt»;

if (file_exists($file)) :

$fh = fopen($file, «r»);

// Выполнить операции с файлом

fclose($fh);

else :

print «File Sfile does not exist!»;

endif;

Запись в файл

С открытыми файлами выполняются две основные операции — чтение и запись.

is_writeable( )

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

bool is_writeable (string файл)

Одно важное обстоятельство: скорее всего, РНР будет работать под идентификатором
пользователя, используемым web-сервером (как правило, «nobody»). Пример
использования is_writeable( ) приведен в описании функции fwrite( ).

fwrite ( )

Функция fwrite( ) записывает содержимое строковой переменной в файл, заданный
файловым манипулятором. Синтаксис функции fwrite( ):

int fwrite(int манипулятор, string переменная [, int длина])

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

<?

// Информация о трафике на пользовательском сайте

$data = «08:13:00|12:37:12|208.247.106.187|Win98″;

$filename = «somefile.txt»;

// Если файл существует и в него возможна запись

if ( is_writeable($filename) ) :

// Открыть файл и установить указатель текущей позиции в конец файла

$fh = fopen($filename, «a+»);

// Записать содержимое $data в файл

$success — fwrite($fh, $data);

// Закрыть файл

fclose($fh); else :

print «Could not open Sfilename for writing»;

endif;

?>

Функция fputs( ) является псевдонимом fwrite( ) и может использоваться всюду,
где используется fwrite( ).

fputs( )

Функция fputs( ) является псевдонимом fwrite( ) и имеет точно такой же
синтаксис. Синтаксис функции fputs( ):

int fputs(int манипулятор, string переменная [, int длина])

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

Чтение из файла

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

is_readable( )

Функция i s_readable( ) позволяет убедиться в том, что файл существует и для
него разрешена операция чтения. Возможность чтения проверяется как для файла,
так и для каталога. Синтаксис функции is_readable( ):

boo! is_readable (string файл]

Скорее всего, РНР будет работать под идентификатором пользователя, используемым
web-сервером (как правило, «nobody»), поэтому для того чтобы функция
is_readable( ) возвращала TRUE, чтение из файла должно быть разрешено всем
желающим. Следующий пример показывает, как убедиться в том, что файл существует
и доступен для чтения:

if ( is_readable($filename) ) :

// Открыть файл и установить указатель текущей позиции в конец файла

$fh = fopen($filename, «r»);

else :

print «$filename is not readable!»;

endif;

fread( )

Функция fread( ) читает из файла, заданного файловым манипулятором, заданное
количество байт. Синтаксис функции fwrite( ):

int fread(int манипулятор, int длина)

Манипулятор должен ссылаться на открытый файл, доступный для чтения (см.
описание функции is_readable( )). Чтение прекращается после прочтения заданного
количества байт или при достижении конца файла. Рассмотрим текстовый файл
pastry.txt, приведенный в листинге 7.1. Чтение и вывод этого файла в браузере
осуществляется следующим фрагментом:

$fh = fopen(‘pastry.txt’, «r») or die(«Can’t open file!»);

$file = fread($fh, filesize($fh));

print $file;

fclose($fh);

Используя функцию fllesize( ) для определения размера pastry.txt в байтах, вы
гарантируете, что функция fread( ) прочитает все содержимое файла.

Листинг 7.1. Текстовый файл pastry.txt

Recipe: Pastry Dough

1 1/4 cups all-purpose flour

3/4 stick (6 tablespoons) unsalted butter, chopped

2 tablespoons vegetable shortening 1/4 teaspoon salt

3 tablespoons water

fgetc( )

Функция fgetc( ) возвращает строку, содержащую один символ из файла в текущей
позиции указателя, или FALSE при достижении конца файла. Синтаксис функции
fgetc( ):

string fgetc (int манипулятор)

Манипулятор должен ссылаться на открытый файл, доступный для чтения (см.
описание функции is_readable( ) ранее в этой главе). В следующем примере
продемонстрированы посимвольное чтение и вывод файла с использованием функции
fgetc( ):

$fh = fopen(«pastry.txt», «r»); while (! feof($fh)) :

$char = fgetc($fh):

print $char; endwhile;

fclose($fh);

fgets( )

Функция fgets( ) возвращает строку, прочитанную от текущей позиции указателя в
файле, определяемом файловым манипулятором. Файловый указатель должен ссылаться
на открытый файл, доступный для чтения (см. описание функции is_readable( )
ранее в этой главе). Синтаксис функции fgets( ):

string fgets (int манипулятор, int длина)

Чтение прекращается при выполнении одного из следующих условий:

· из файла прочитано длина — 1 байт;

· из файла прочитан символ новой строки (включается в возвращаемую строку);

· из файла прочитан признак конца файла (EOF).

Если вы хотите организовать построчное чтение файла, передайте во втором
параметре значение, заведомо превышающее количество байт в строке. Пример
построчного чтения и вывода файла:

$fh = fopen(«pastry.txt», «r»);

while (! feof($fh));

$line = fgets($fh, 4096);

print $line. «<br>»;

endwhile;

fclose($fh):

fgetss( )

Функция fgetss( ) полностью аналогична fgets( ) за одним исключением — она
пытается удалять из прочитанного текста все теги HTML и РНР:

string fgetss (Int манипулятор, int длина [, string разрешенные_теги])

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

Листинг 7.2. Файл science.html

<html>

<head>

<title>Breaking News — Science</title>

<body>

<h1>Alien lifeform discovered</h1><br>

<b>August 20. 2000</b><br>

Early this morning, a strange new form of fungus was found growing in the closet
of W. J. Gilmore’s old apartment refrigerator. It is not known if powerful
radiation emanating from the tenant’s computer monitor aided in this evolution.

</body>

</html>

Листинг 7.З. Удаление тегов из файла HTML перед отображением в браузере

<?

$fh = fopen(«science.html», «r»);

while (! feof($fh)) :

print fgetss($fh, 2048);

endwhile;

fclose($fh);

?>

Результат приведен ниже. Как видите, из файла science.html были удалены все теги
HTML, что привело к потере форматирования:

Breaking News — Science Alien lifeform discovered August 20. 2000 Early this
morning, a strange new form of fungus was found growing in the closet of W. J.
Gilmore’s old apartment refrigerator. It is not known if powerful radiation
emanating from the tenant’s computer monitor aided in this evolution.

В некоторых ситуациях из файла удаляются все теги, кроме некоторых — например,
тегов разрыва строк <br>. Листинг 7.4 показывает, как это делается.

Листинг 7.4. Выборочное удаление тегов из файла HTML

<?

$fh = fopenC’science.html», «r»);

$allowable = «<br>»;

while (! feof($fh)) :

print fgetss($fh. 2048, $allowable);

endwhile;

fclose($fh);

?>

Результат:

Breaking News — Science Alien lifeform discovered August 20. 2000 Early this
morning, a strange new form of fungus was found growing in the closet of W. J.
Gilmore’s old apartment refrigerator. It is not known if powerful radiation
emanating from the tenant’s computer monitor aided in this evolution.

Как видите, функция fgetss( ) упрощает преобразование файлов, особенно при
наличии большого количества файлов HTML, отформатированных сходным образом.

Чтение файла в массив

Функция file( ) загружает все содержимое файла в индексируемый массив. Каждый
элемент массива соответствует одной строке файла. Синтаксис функции filе ( ):

array file (string файл [, int включение_пути])

Если необязательный третий параметр включение_пути равен 1, то путь к файлу
определяется по отношению к каталогу включаемых файлов, указанному в файле
php.ini (см. главу 1). В листинге 7.5 функция file( ) используется для загрузки
файла pastry.txt (см. листинг 7.1).

Листинг 7.5. Загрузка файла pastry.txt функцией file( )

<?

$file_array = file( «pastry.txt» );

while ( list( $line_num. $line ) = eacht($file_array ) ):

print «<b>Line $line_num:</b> «, htmlspecialchars($line ), «<br>\n»

endwhile;

?>

Каждая строка массива выводится вместе с номером:

Line 0: Recipe: Pastry Dough

Line 1: 1 1/4 cups all-purpose flour

Line 2: 3/4 stick (6 tablespoons) unsalted butter, chopped

Line 3: 2 tablespoons vegetable shortening

Line 4: 1/4 teaspoon salt

Line 5: 3 tablespoons water

Перенаправление файла в стандартный выходной поток

Функция readfile( ) читает содержимое файла и направляет его в стандартный вывод
(в большинстве случаев — в браузер). Синтаксис функции readfile( ):

int readfile (string файл [, int включение_пути])

Функция возвращает количество прочитанных байтов. Файл может находиться в
локальной файловой системе, существовать в виде стандартного потока ввода/вывода
или представлять файл в удаленной системе, принимаемой средствами HTTP или FTP.
Параметр файл задается по тем же правилам, что и в функции fopen( ).

Предположим, у вас имеется файл latorre.txt, содержимое которого вы хотите
вывести в браузере:

Restaurant «La Тоrrе.» located in Nettuno, Italy, offers an eclectic blend of
style. history, and fine seafood cuisine. Within the walls of the medieval borgo
surrounding the city, one can dine while watching the passersby shop in the
village boutiques. Comfort coupled with only the freshest seafare make La Torre
one of Italy’s finest restaurants.

При выполнении следующего фрагмента все содержимое latorre.txt направляется в
стандартный выходной поток:

<?

$restaurant_file = «latorre.txt»;

// Направить весь файл в стандартный выходной поток

readfile($restaurant_filе);

?>

Открытие файлового манипулятора процесса

popen( )

Наряду с обычными файлами можно открывать файловые манипуляторы для
взаимодействия с процессами на сервере. Задача решается функцией рореn( ),
которая имеет следующий синтаксис:

int popen (string команда, string режим)

Параметр команда определяет выполняемую системную команду, а параметр режим
описывает режим доступа:

<?

// Открыть файл «spices.txt» для записи

$fh = fopen(«spices.txt»,»w»);

// Добавить несколько строк текста

fputs($fh, «Parsley, sage, rosemary\n»);

fputs($fh, «Paprika, salt, pepper\n»);

fputs($fh, «Basil, sage, ginger\n»);

// Закрыть манипулятор

fclose($fh);

// Открыть процесс UNIX grep для поиска слова Basil в файле spices.txt

$fh — popen(«grep Basil < spices.txt», «r»);

// Вывести результат работы grep

fpassthru($fh);

?>

Результат выглядит так:

Basil, sage, ginger

Функция fpassthru( ) является аналогом функции passthru( ), рассматриваемой в
разделе «Запуск внешних программ» этой главы.

pclose( )

После выполнения всех операций файл или процесс необходимо закрыть. Функция
pclose( ) закрывает соединение с процессом, заданным манипулятором, по аналогии
с тем, как функция fclose( ) закрывает файл, открытый функцией fopen( ).
Синтаксис функции pclose( ):

int pclose (int манипулятор}

В параметре манипулятор передается манипулятор, полученный ранее при успешном
вызове рореn( ).

Открытие соединения через сокет

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

fsockopen( )

Функция fsockopen( ) устанавливает сокетное соединение с сервером в Интернете

через протокол TCP или UDP. Синтаксис функции fsockopen( ):

int fsockopen (string узел, int порт [, int код_ошибки [, string текст_ошибки [,
int тайм-аут]]])

<—PAGEBREAK—>

Необязательные параметры код_ошибки и текст_ошибки содержат информацию, которая
будет выводиться в случае неудачи при подключении к серверу. Оба параметра
должны передаваться по ссылке. Третий необязательный параметр, тайм-аут, задает
продолжительность ожидания ответа от сервера (в секундах). В листинге 7.6
продемонстрировано применение функции fsockopen( ) для получения информации о
сервере. Однако перед рассмотрением листинга 7.6 необходимо познакомиться еще с
одной функцией — socket_set_blocking( ).

UDP (User Datagram Protocol) — коммуникационный протокол, не ориентированный на
соединение.

socket_set_blocking( )

Функция socket_set_b1ocki ng( ) позволяет установить контроль над тайм-аутом для
операций с сервером:

socket_set_blocking(int манипулятор, boolean режим)

Параметр манипулятор задает открытый ранее сокет, а параметр режим выбирает
режим, в который переключается сокет (TRUE для блокирующего режима, FALSE для
неблокирующего режима). Пример использования функций fsockopen( ) и
socket_set_blocking( ) приведен в листинге 7.6.

Источник:   codingrus.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи