5W site logo 5W - мой домашний сайт-блог с картинками, кино и плюшками.

06-files.html

6 Работа с файлами в PHP

Файл - это упорядоченная совокупность данных, хранимая на диске, занимающая именованную область внешней памяти и имеющая свое расширение. Данная совокупность не может повторяться, поэтому каждый файл имеет имя, отличное от других файлов [4].

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

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

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

Синтаксис:

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

где $filename – имя файла или абсолютный путь к нему, если файл находится не в текущем каталоге,

$mode – режим открытия файла,

$use_include_path – параметр, который говорит о том, что, если задано относительное имя файла, его следует искать также и в списке путей, то есть определяет, должны ли искаться файлы в каталоге include_path. Параметр include_path устанавливается в файле php.ini.

Параметр “$mode”, указывающий, для каких действий открывается файл, может принимать следующие значения:

  • “r” - файл открывается только для чтения. Если файла не существует, вызов регистрирует ошибку. После удачного открытия указатель файла устанавливается на его первый байт, то есть на начало;
  • “r+” - файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на первый байт. Если файла не существует, возвращается false. Если в момент записи указатель файла установлен где-то по середине файла, то данные запишутся прямо поверх уже имеющихся, при необходимости увеличив размер файла;
  • “w” - создает новый пустой файл. Если на момент вызова файл с таким именем уже существовал, то он предварительно уничтожается. В случае неверно заданного имени файла, вызов завершается неудачей;
  • “w+” - аналогичен “r+”, но если файл изначально не существовал, он создается. После этого с файлом можно работать как в режиме чтения, так и в режиме записи. Если файл существовал до момента вызова, его содержимое удаляется;
  • “a” - открывает существующий файл в режиме записи, и при этом сдвигает указатель текущей позиции за последний байт файла. Вызов неуспешен в случае отсутствия файла;
  • “a+” - открывает файл в режиме чтения и записи, указатель файла устанавливается на конец файла, при этом содержимое файла не уничтожается. Отличается от “a” тем, что если файла изначально не существовало, то он создается. Этот режим полезен, если нужно что-то дописать в файл, но неизвестно, создан ли уже такой файл;
  • “b” - флаг, указывающий на работу (чтение и запись) с двоичным файлом.

В нижепредставленном коде приведен пример открытия файла “test.txt” для записи:

$fp=fopen("test.txt", "r");

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

Например, два варианта открытия файла “test.txt” абсолютно идентичны:

$fp = fopen("test.txt", "r");

и

$file = "test.txt";
$fp = fopen($file, "r");

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

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

$fp = fopen("data.txt", "r");
if(!$fp) echo "Невозможно открыть файл";

Этот код можно переписать так:

if(!($fp = fopen("data.txt", "r")))
echo "Невозможно открыть файл";

В данном случае проверяется не равенство “$fр” результату вызова функции fopen, а лишь успешность открытия файла. Это сокращенный способ проверки, который позволяет, в случае успешного выполнения операции, сохранить дескриптор файла в переменной “$fp” для последующего использования.

Открытие двоичного файла, к примеру, рисунка происходит таким же образом, только с флагом b:

$file = fopen("c:/www/html/river.jpg","rb");
if(!file) echo("Ошибка открытия файла");

Данная функция также позволяет указать файл на удаленном узле и открывает его через HTTP или FTP, как показано в примере:

if(!($fp = fopen("http://www.Mysait.ru/index.html", "r")))
echo "Невозможно открыть файл.";

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

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

Синтаксис:

int tmpfile(),

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

Ниже представлен пример работы функции tmpfile.

<HTML>
<HEAD>
<TITLE>Пример использования функции tmpfile</TITLE>
</HEAD>
<BODY>
<?php
$temp = tmpfile(); // создание временного файла
fwrite($temp, "строка, записываемая во временный файл");
fseek($temp, 0); // происходит перевод указателя на начало файла
echo fread($temp, 1024);
fclose($temp); // удаление файла
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.1


Рисунок 6.1– Запись информации во временный файл

ТТаким образом, как видно на рисунке 6.1, в данном примере с помощью функции tmpfile был создан временный файл, в который была помещена строка.

Функция fclose закрывает файл, открытый ранее функцией fopen.

Синтаксис:

int fclose(int $fp),

где $fp – дескриптор открытого файла.

Функция fclose осуществляет закрытие файла “$fp”, указанного в ее аргументе и возвращает false, если файл закрыть не удалось. В противном случае функция возвращает значение true.

Например, в представленном ниже коде с помощью функции fclose закрывается открытый ранее файл “test.txt”, связанный с дескриптором “$fp”:

$fp = fopen("test.txt", "r");

fclose($fp);

Функция fwrite осуществляет запись строки текста в файл.

Синтаксис:

int fwrite(int $f, string $str[, int length]),

где $f – дескриптор файла,

$str – записываемая строка,

$length - количество символов в строке, которые должны быть записаны.

Функция fwrite записывает в файл, определенный дескриптором “$f”, все содержимое строки $str. Функция возвращает количество записанных байт или -1 в случае ошибки. При этом, если третий аргумент не указан, записывается вся строка.

Например, в представленном ниже коде

$fp = fopen("text.txt", "w")

можно использовать такой код:

fwrite($fp, "АБВГД");

в результате работы функции fwrite в начало файла “test.txt” была записана строка “АБВГД”. Посколь¬ку, при открытии файла использовался режим только для записи, вся информация, ко¬торая была в файле “test.txt” до этого, будет утеряна. А если файл не существовал, то будет соз¬дан новый файл “test.txt”. Однако повторение данного вызова приведет к тому, что в конец файла будут записаны те же пять байт, и в файл будет записана строка “АБВГДАБВГД”. Это также связано с работой указателя позиции в файле.

Если в данном примере указать в качестве третьего аргумента целое значение “$length”, то функция прекратит работу сразу после записи “$length” байт. Если строка содержит менее чем “$length” байт, то она будет записана в файл полностью.

Например, в представленном ниже коде

fwrite($fp, "День добрый", 4);

в файл, заданный “$fp”, запишется первые четыре байта строки “День добрый”, то есть “День”.

Далее представлен пример работы функции fwrite для записи информации о заказах покупателей в Интернет-магазине в файл. Имеется форма заказа цветов, в которую пользователь вносит свою информацию. Необходимо осуществить обработку данных пользователя из форм. Всю информацию о заказах необходимо сохранить в текстовый файл.

Ниже представлен HTML-код формы заказа цветов.

<HTML>
<HEAD>
<TITLE>Пример использования функции fwrite</TITLE>
</HEAD>
<BODY>
<H2>Заказ цветов в Интернет-магазине.</H2> <P>Введите информацию для оформления заказа:</P>
<FORM action="zakaz.php" method="post">
Фамилия:<input type="text" name="surname"><BR />
Имя:<INPUT type="text" name="firstname"><BR />
Отчество:<INPUT type="text" name="secondname"><BR />
Цветы:
<SELECT name="type">
<OPTION selected value="1">Розы</OPTION >
<OPTION value="2">Ромашки</OPTION >
<OPTION value="3">Тюльпаны</OPTION >
</SELECT>
<BR />
Количество: <INPUT type="text" size="2" name="num">
<BR />
Стоимость:
<SELECT name="price">
<OPTION selected value="100">100</OPTION >
<OPTION value="200">200</OPTION >
<OPTION value="300">300</OPTION >
</SELECT>
<BR />
Адрес доставки: <INPUT type="text" name="address" size="50"/><BR />
<INPUT type="submit" value="Сделать заказ">
</FORM>
</BODY>
</HTML>

В результате выполнения данного кода появится следующая страница, представленная на рисунке 6.2.


Рисунок 6.2 – Форма заказа цветов

Таким образом, как видно на рисунке 6.2, в данном примере, после загрузки Web-страницы на экране появляется форма для ввода информации о заказе пользователя. После ввода информации необходимо нажать кнопку “Сделать заказ”. После этого подключится обработчик, указанный в атрибуте “action” тега “form”. В данном примере это файл zakaz.php.

Ниже представлен код файла zakaz.php.

<HTML>
<HEAD>
<TITLE>Пример использования функции fwrite</TITLE>
</HEAD>
<BODY>
<?php
$name=$_POST['firstname'];
$surname=$_POST['surname'];
$secondname=$_POST['secondname'];
$flower=$_POST['type'];
$price=$_POST['price'];
$num = $_POST['num'];
$address = $_POST['address'];
if($flower == "1") $flower = "Розы";
if($flower == "2") $flower = "Ромашки";
if($flower == "3") $flower = "Тюльпаны";
$str = "Покупатель " .$surname. " " .$name. " ". $secondname." заказал " . $flower . " в количестве ". $num . " штук, общей суммой " . $price*$num . ". Их необходимо доставить по адресу: " .$address. "\n<br/>";
// запись информации о заказе в строку
?>
<H2>Ваш заказ: </H2> <br />
<?php
echo $str; // вывод на экран содержимого текущего заказа
if(!($fp = fopen("log.txt", "a+"))) {echo "Не могу открыть файл!";}
fwrite($fp, $str); //запись информации о заказе в файл
fclose($fp);
?>
</BODY>
</HTML>

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

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

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

Реализация данного кода представлена на рисунке 6.3.


Рисунок 6.3 – Пример работы обработчика заказа

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

Функция fread осуществляет чтение строки из открытого файла.

Синтаксис:

string fread(int $fp, int $length),

где $fp – дескриптор открытого файла,

$length – количество символов строки.

Функция fread читает из файла, заданного дескрипоторм “$fp”, число “$length” символов и возвращает строку этих символов. После чтения указатель файла продвигается к следующей после прочитанного блока позиции. Если число “$length” больше содержимого файла, возвращается та информация, которую удалось считать.

Например, в представленном ниже коде

$fp = fopen ("data.txt", "r")
$data = fread($fp, 10);

с помощью функции fread реализовано считывание первых 10 байт из файла “data.txt” и запись их в переменную “$data” как строку символов. Функция fread перемещает указатель позиции в файле на 10 байт вниз, поэтому, если повторить тот же вызов fread, то в переменную “$data” будут записаны следующие 10 байт файла. Если в файле осталось менее 10 непрочитанных байт, то функция прочитает и возвратит столько байт, сколько осталось.

Ниже представлен пример работы функции fread для чтения из существующего текстового файла “log.txt” информации обо всех заказах цветов покупателей в Интернет-магазине.

<HTML>
<HEAD>
<TITLE>Пример использования функции fread</TITLE>
</HEAD>
<BODY>
<H2>Список всех заказов:</H2>
<?php
if(!($fp = fopen("log.txt", "r"))) {echo "Не могу открыть файл!";}
while (!feof($fp)){
$order = fread($fp, 300); // чтение содержимого файла в цикле
echo $order."<BR>";
// вывод на экран считанной информации из файла
}
fclose($fp);
?>
</BODY>
</HTML>

Результат работы данного кода представлен на рисунке 6.4.


Рисунок 6.4 - Чтение информации о заказах и вывод ее на экран

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

Функция fgets читает из файла строку, заканчивающуюся символом новой строки.

Синтаксис:

string fgets(int $fp, int $length),

где $fp – дескриптор открытого файла,

$length – количество символов.

Функция fgets читает и возвращает строку длиной “$length”-1 байт из файла “$fp”, переданного в ее параметрах. Если строка в файле занимает больше “$length”-1 байт, то возвращаются только ее “$length”-1 символов. При достижении конца файла, функция возвращает пустую строку. Символ новой строки также считывается и включается в результат.

Например, в представленном ниже коде

$s= fgets($fp, 100);

было считано из файла “$fp” строки, длиной 100 символов.

Функция прекращает чтение по одной из трех перечисленных ниже причин:

  • прочитано заданное количество байт;
  • достигнут конец строки;
  • достигнут конец файла.

Различие между fgets и fread заключается в том, что fgets прекращает чтение после того, как был достигнут конца строки или считано “$length” - 1 байт, тогда как функция fread игнорирует конец строки и считывает “$length” байт.

Ниже представлен пример поиска информации о заказах в файле по введенному критерию.

HTML-код формы ввода значения для поиска предстален ниже.

<HTML>
<HEAD>
<TITLE>Пример использования функции fgets </TITLE>
</HEAD>
<BODY>
<P>Введите критерий поиска заказа:</P>
<FORM name="filter" method="post" action="filter.php">
<LABEL>Введите строку запроса:</LABEL>
<INPUT type="text" name="filter_query"/>
<INPUT type="submit" value="Найти" name="submit" />
</FORM>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.5.


Рисунок 6.5 – Ввод значения для поиска

Таким образом, как видно на рисунке 6.5, в данном примере, при загрузке Web-страницы на экране появляется форма, в которую необходимо ввести критерий для поиска информации о заказах покупателей. После этого необходимо нажать кнопку “Найти”. При этом подключится обработчик, указанный в атрибуте “action” тега “form”. В данном примере это файл filter.php.

Пример файла обработки критерия для поиска представлен ниже.

<HTML>
<HEAD>
<TITLE> Пример использования функции fgets </TITLE>
</ HEAD>
<BODY>
<?php
$query=$_POST['filter_query'];
?>
Найденные заказы по запросу <strong>
<?php echo $query;?></strong>: <br />
if(!($fp = fopen("log.txt", "r")))
{echo "Не могу открыть файл!";}
while (!feof($fp)){ $order = fgets($fp, 300);
if (stristr($order, $query)){echo $order."<br >";}
fclose($fp);
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.6.


Рисунок 6.6 – Вывод информации об определенном заказе

Таким образом, как видно на рисунке 6.6, в данном примере был осуществлен поиск информации о заказах по критерию пользователя. При этом чтение данных из файла осуществлялось с помощью функции fgets.При вводе фамилии “Иванов”, на экран была выведена полная информация о заказе, сделанном этим покупателем.

Функция fputs осуществляет запись текстовой информации в файл.

Синтаксис:

int fputs(int $f, string $str[, int $length]),

где $f – дескриптор файла,

$str – записываемая строка,

$length - количество символов в строке, которые должны быть записаны.

Функция fputs записывает в файл, заданный дескриптором “$fp” строку “$str”. Функция возвращает количество записан¬ных в файл байт или -1, в случае ошибки. При этом если третий аргумент не указан, записывается вся строка. Функция является полным аналогом функции fwrite.

Например, в ниже представленном коде

$fp = fopen("data.txt", "w");
fputs($fp, "Привет!");

в результате использования функции fputs, в начало файла “data.txt” осуществлялась запись строки “Привет!”.

В другом примере, представленном ниже

$filename = "test.txt" ;
$somecontent = "Текст для записи в файл" ;
if (!($handle = fopen ( $filename , 'a' ))) exit ;
fputs( $handle , $somecontent );
fclose ( $handle );

с помощью функции fputs в файл “test.txt” была записана строка “Текст для записи в файл”.

Функция fputs часто используется для создания счетчика посещений Web-сайта. Например, если для каждой цифры в счетчике имеется изображение (файлы 1.gif, 2.gif, 3.gif и т.д.), то каж¬дое численное значение можно использовать для указания графического файла, свя¬занного с данной цифрой.

При этом для чтения информации о посещениях используется функция fread, а для записи номера очередного пользователя функция fputs.

Ниже представлена работа функции fputs на примере создания графического счетчика посещений.

<HTML>
<HEAD>
<TITLE>Пример использования функции fputs </TITLE>
</HEAD>
<BODY>
<?php
$counter_file = "count.txt";
$image_dir = "images";
if(!($fp = fopen($counter_file, "r")))
{
echo "Невозможно открыть файл $counter_file.";
}
$counter = (int) fread($fp, 20);
fclose($fp);
$counter++;
for ($i=0; $i < strlen($counter); $i++)
{
$image_src = $image_dir . "/" . substr($counter, $i, 1) . ".gif";
$image_tag_str .= "<img src= \"$image_src\" border=\"0\">";
}
echo "Вы - посетитель № $image_tag_str.";
$fp = fopen($counter_file, "w");
fputs($fp, $counter);
fclose($fp);
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.7.


Рисунок 6.7 – Графический счетчик посещений

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

Функция fgetc предназначена для считывания из файла по одному символу за раз.

Синтаксис:

string fgetc(int $fp),

где $fp - дескриптор открытого файла.

Функция fgetc принимает один аргумент, дескриптор файла “$fp”, и возвращает только один символ из связанного с данным дескриптором файла. Если функция достигает конца файла, то она возвращает false.

При этом код

$one_char = fgetc($fp);

эквивалентен данному коду:

$one_char = fread($fp,1);

Ниже представлен пример работы функции fgetc

<HTML>
<HEAD>
<TITLE>Пример использования функции fgetc</TITLE>
</HEAD>
<BODY>
<?php
$file = "test.txt";
if(!($fp = fopen($file, "r")))
{
echo "Невозможно открыть файл $file.";
}
$rezult = "";
while (!feof($fp))
{
$ch = fgetc($fp); // чтение содержимого файла
echo "$ch<br>";
}
fclose($fp);
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.8.


Рисунок 6.8 – Посимвольное считывание информации

Таким образом, как видно на рисунке 6.8, в данном примере с помощью функции fgetc было осуществлено чтение данных из файла и вывод их на экран.

Функция fgetss позволяет считывать строку из заданного файла, при этом удаляет из него все HTML-теги, за исключением указанных.

Синтаксис:

string fgetss(int $fp, int $length [, string $tegnames]),

где $fp - дескриптор открытого файла,

$length - длина строки в символах,

$tegnames - теги, которые не надо удалять.

Функция fgetss принимает два аргумента “$fp” и “$length”, и возвращает прочитанную из файла, заданного дескриптором “$fp”, строку, длина которой не превышает значения “$length” (“$length”-1). При этом аргумент “$length” обязательный.

Необязательный третий параметр “tegnames” может содержать строку со списком тегов, которые не должны быть отброшены, при этом теги в строке записываются через запятую.

Например, в представленном ниже коде

$file="test.txt";
fgetss($fp, 1024, '<b>');

с помощью функции fgetss из файла “test.txt” была считана строка длиной 1024 символов, при этом были удалены все теги, кроме <b>.

Ниже представлен пример работы функции fgetss. В данном примере осуществляется чтение данных из текстового файла “test.txt”. Содержимое текстового файла “test.txt” с HTML-тегами приведено на рисунке 6.9.


Рисунок 6.9 - Текстовый файл “test.txt”

HTML-код обработчика представлен ниже.

<HTML>
<HEAD>
<TITLE>Пример использования функции fgetss</TITLE>
</HEAD>
<BODY>
<?php
$file = "test.txt";
if(!($fp = fopen($file, "r")))
{ echo "Невозможно открыть файл $file."; }
while (!feof($fp))
{ $rezult = (fgetss($fp,30,'<i>')."<br>");
echo $rezult; }
fclose($fp);
?>
</BODY>
</HTML>

Пример работы сценария приведен на рисунке 6.10.


Рисунок 6.10 – Считывание информации из файла без учёта тега <b>

Таким образом, как видно на рисунке 6.10, в данном примере с помощью функции fgetss было осуществлено чтение данных из текстового файла, которые были выведены на экран. При этом были удалены все теги, кроме тега <i>, соответственно фамилия “Есенин” была выведена курсивом

Функция fgetcsv предназначена для работы с одним из форматов файлов для хранения таблиц редактора Excel.

Синтаксис:

list fgetcsv(int $fp, int $length, char $delim=","),

где $fp - дескриптор открытого файла,

$length - длина строки в символах,

$delim - разделитель.

Функция fgetcsv читает строку из файла, заданного дескриптором “$fp” и разбивает ее по символу “$delim”. Параметр “$delim” должен обязательно быть строкой из одного символа, в противном случае принимается во внимание только первый символ этой строки.

Функция возвращает получившийся список или false, если строки закончились. Параметр “$length” задает максимальную длину строки точно так же, как это делается при использовании функции fgets. Пустые строки в файле не игнорируются, а возвращаются как список из одного элемента - пустой строки.

Ниже представлен пример работы функции fgetcsv. В данном примере осуществляется работа по чтению данных из файла file.csv. Содержимое файла file.csv представлено на рисунке 6.11.


Рисунок 6.11 - Текстовый файл file.csv

HTML-код обработчика представлен ниже.

<HTML>
<HEAD>
<TITLE>Пример использования функции fgetcsv</TITLE>
</HEAD>
<BODY>
<?php
if(!$f=fopen("file.csv","r")) echo "Ошибка"; // вывод ошибки
for($i=0; $data=fgetcsv($f, 1000, ";"); $i++)
{ // считываются данные построчно
$num = count($data); // определяется количество значений в строке
if($num==1 && $data[0]=="") continue; // переход на другую строку, если строка пустая
echo "<h3>Строка номер $i ($num поля):</h3>";
for($c=0; $c<$num; $c++)
{ print "[$c]: $data[$c]<br>";} }
fclose($f);
?>
</BODY>
</HTML>

Пример работы сценария приведен на рисунке 6.12.


Рисунок 6.12 – Вывод на экран содержимого csv-файла

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

Функция feof является указателем конца файла.

Синтаксис:

int feof(int $f),

где $f - дескриптор открытого файла.

Функция feof указывает на конец файла “$fp”, заданного в ее параметре и возвращает true, если достигнут конец файла, то есть если указатель файла установлен за концом файла.

Например, в нижепредставленном коде возвращается true, если достигнут конец файла myfile.txt.

$f=fopen("myfile.txt","r");
while(!feof($f)) // проверка, достинут ли конец файла
{
// работа с файлом myfile.txt
}
fclose($f);

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

Функция fseek устанавливает указатель файла на определенную позицию.

Синтаксис:

int fseek(int $fp, int $offset[, int $whence=SEEK_SET]),

где $fp - дескриптор открытого файла;

$offset - смещение;

$whence - параметр, отвечающий за позицию считывания.

Функция fseek устанавливает указатель файла “$fp”, заданного в ее параметрах, на байт со смещением “$offset” (от начала файла, от его конца или от текущей позиции, в зависимости от параметра “$whence”). Параметр “$whence” задает, с какого места отсчитывается смещение “$offset”.

Если передать функции fseek в качестве аргументов дескриптор файла “$fp” и целое смещение, то данная функция переместит указатель позиции в файле, связанном с дескриптором “$fp”, в позицию, которая опре¬деляется смещением “$offset”. По умолчанию смещение отсчитывается в байтах от начала файла

Например, в представленном ниже коде

fseek($fp, 5);
$one_char = fgetc($fp);

помещается указатель позиции в файле, связанном с дескриптором “$fp”, сразу после пятого байта в этом файле. Следовательно, вызов функции fgetc возвращает содержимое шестого байта.

Для расчета относительного смещения с помощью одного из следующих значений можно задать третий необязательный аргумент “whence” (точка отсчета):

  • SEEK_SET: начало файла плюс смещение;
  • SEEK_CUR (используется по умолчанию): текущая позиция плюс смещение;
  • SEEK_END: конец файла плюс смещение.

В случае использования последних двух констант параметр “$offset” вполне может быть отрицательным (а при применении SEEK_END он будет отрицательным). При этом функция fseek является целочисленной РНР функцией и возвращает 0, а не 1, в случае успеха, и -1 в случае неудачи.

Ниже приведен пример использования фукнции fseek.

<HTML>
<HEAD>
<TITLE>Пример использования функции fseek</TITLE>
</HEAD>
<BODY>
<?php
if(!$fp=fopen("test.txt","r")) echo "Ошибка";
$one_char = fgetc($fp);
echo "<B>Первый символ: </B> $one_char"; fseek($fp, 5);
$one_char = fgetc($fp);
echo "<B>Четвертый символ:</B> $one_char"; fclose($f);
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.13.


Рисунок 6.13 – Вывод на экран первого и четвертого символов файла “test.txt”

Таким образом, как видно на рисунке 6.13, в данном примере с помощью функции fgetc были считаны и выведены на экран первый и четвертый символы исходного файла. При этом в данном файле было записано слово “Файл”, соответственно, были выведены буквы “Ф” и “Л”.

Функция ftell возвращает текущее положение указателя файла.

Синтаксис:

int ftell(int $fp),

где $fp – дескриптор открытого файла.

Функция ftell принимает дескриптор файла и возвращает текущую позицию указателя в файле “$fp”, переданного в ее параметре

Например, в представленном ниже коде

$f="test.txt";
$p=ftell($f);

с помощью функции ftell определяется позиция указателя в файле, связанном с дескриптором “$fp”.

Совместно с функцией ftell можно использовать фукнцию rewind. Данная фукнция принимает дескриптор файла и переустанавливает указатель позиции в начало этого файла.

При этом вызов

rewind($fp);

функционально аналогичен вызову

fseek($fp, 0).

Ниже приведен пример навигации по файлу “address.txt”, в котором используются описанные функции fseek, ftell и rewind. Предполагается, что файл “address.txt” находится в текущем каталоге и является адресной книгой, Содержимое файла “address.txt” представлено на рисунке 6.14.


Рисунок 6.14 – Содержимое текстового файла “address.txt”

HTML-код обработчика представлен ниже.

<HTML>
<HEAD>
<TITLE>Пример использования функций fseek, ftell и rewind </TITLE>
</HEAD>
<BODY>
<?php
$name_field_len = 20;
$country_field_len = 15;
$email_field_len = 30;
if(!($fp = fopen("address.txt", "r")))
{
echo "Невозможно открыть файл с адресными данными.";
}
do
{
$address = "";
$field = fread($fp, $name_field_len);
$address .= $field;
$field = fread($fp, $country_field_len);
$address .= $field;
$field = fread($fp, $email_field_len);
$address .= $field;
echo "$address<br />";
}
while($field);
rewind($fp); // указатель файла переносится в начало файла
echo "<br />";
do{
$name = fread($fp, $name_field_len); // считывается только фамилия и имя
fseek($fp, ftell($fp) + $country_field_len + $email_field_len + 1); // переход на следующие фамилию и имя
echo "$name<br />";
}
while($name); // пока не закончились строки
fclose($fp);
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.15.


Рисунок 6.15 – Чтение из файла полей заданной длины

Таким образом, как видно на рисунке 6.15, в данном примере на экран было реализовано чтение данных из исходного файла, представленного в виде адресной книги. В результате на экран были выведены фамилии, имена и отчества всех людей из этого файла. При этом записи в данном файле отделяются друг от друга символами новой строки. Каждое поле имеет фиксирован¬ную длину: 20 символов для имени, 15 символов для названия страны и 30 символов для почтового адреса.

Функция file_exists проверяет, существует ли файл или директория.

Синтаксис:

bool file_exists(string $filename),

где $filename - имя файла.

Функция file_exists проверяет, существует ли файл или директория, имя которой передано ей в качестве аргумента “$filename”. Функция возвращает true, если файл или директория существует и false, в противном случае.

Ниже представлен пример работы функции file_exists.

<HTML>
<HEAD>
<TITLE>Пример использования функции file_exists</TITLE>
</HEAD>
<BODY>
<?php
$filename ="c:/users/files/file.html";
if (file_exists($filename))
{
print "Файл <b>$filename</B> существует"; }
else print "Файл <b>$filename</B> не существует";
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.16.


Рисунок 6.16 – Проверка существования файла

Таким образом, как видно на рисунке 6.16, в данном примере с помощью функции file_exist осуществлялась проверка существования исходного файла во вложенной директории на сервере. В результате проверки оказалось, что файла “C:/users/files/file.html” не существует.

Функция is_file осуществляет проверку существования файла.

Синтаксис:

bool is_file(string $filename),

где $filename - имя файла.

Функция is_file проверяет, является ли введенное имя именем файла, и возвращает true, если заданное имя ссылается на файл и false, в обратном случае.

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

Например, в представленном ниже коде

$file = "somefile.txt";
if (is_file($file)):
print "Файл $file существует и готов для чтения и записи!";

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

Функция is_dir проверяет является введенное имя именем каталога.

Синтаксис:

bool is_dir(string $dirname),

где $dirname - имя каталога.

Функция is_dir осуществяет проверку существования каталога “$dirname”, переданного в ее параметре, и возвращает true, если заданное имя ссылается на какой-либо каталог, и false, в обратном случае.

Например, в следующем ниже коде

$isdir = is_dir("book"); // функция возвращает true

функция is_dir возвратит true, так как заданное имя “book” является каталогом.

Ниже приведен пример совместного использования функций is_file и is_dir для проверки, является имя “index.php” файлом или каталогом.

<HTML>
<HEAD>
<TITLE>Пример использования функций is_file и is_dir</TITLE>
</HEAD>
<BODY>
<?php
$f = "index.php";
if(is_dir($f))
{ echo "$f - каталог."; }
else if (is_file($f))
{ echo "$f - файл."; }
else { echo "$f - не файл и не каталог."; }
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.17.


Рисунок 6.17 – Проверка принадлежности пути к файлам или папкам

Таким образом, как видно на рисунке 6.17, в данном примере с помощью функций is_file и is_dir осуществлялась проверка исходного файла. В результате проверки оказалось, что заданное имя является файлом.

Функция is_readable осуществляет проверку существования файла, доступного для чтения.

Синтаксис:

bool is_readable(string $filename),

где $filename - имя файла.

Функция is_readable осуществляет проверку файла “$filename”, заданного в ее параметре и возвращает true, если разрешено читать информацию из заданного файла или false, в обратном случае.

Ниже представлен пример работы функции is_readable.

<HTML>
<HEAD>
<TITLE>Пример использования функции is_readable</TITLE>
</HEAD>
<BODY>
<?php
$filename ="c:/users/files/my_file.html";
if (is_readable($filename)) print "Файл <B>$filename</B> существует и доступен для чтения";
else print "Файл <B>$filename</B>не существует или не доступен для чтения";
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.18.


Рисунок 6.18 – Проверка файла на возможность чтения

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

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

Синтаксис:

bool is_writeable(string $filename),

где $filename - имя файла.

Функция is_writeable осуществляет проверку файла “$filename”, заданного в ее параметре, и возвращает true, если разрешено записывать информацию в файл и false, в обратном случае.

Ниже представлен пример работы функции is_writeable.

<HTML>
<HEAD>
<TITLE>Пример использования функции is_writeable</TITLE>
</HEAD>
<BODY>
<?php
$filename ="test.txt";
$somecontent ="Добавить это к файлу" ;
if ( is_writable ( $filename )) { // проверка существования файла
if (! $handle = fopen ( $filename , 'a' )) {
echo "Не могу открыть файл ($filename)" ; exit ; }
if ( fwrite ( $handle , $somecontent ) == FALSE ) { // запись $somecontent в открытый файл.
echo "Невозможно осуществить запись в файл ($filename)" ;
exit ; }
echo "Фрагмент текста \"$somecontent\" записан в файл $filename";
fclose ( $handle ); }
else { echo "Файл $filename не доступен для записи" ;
}
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.19.


Рисунок 6.19 - Вывод ошибки при попытке записи в файл

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

Как видно на рисунке 6.19, при запуске данного сценария возникает ошибка. Это обусловлено тем, что сценарий предпола¬гает, что файл “test.txt” существует и расположен в текущем каталоге. Если такого файла в данном каталоге нет, то возникает ошибка. После создания файла необходимо снова проверить работу сценария. Реализация данного кода представлена на рисунке 6.20.


Рисунок 6.20 – Удачная запись в файл

Таким образом, как видно на рисунке 6.20, в данном примере, в том случае, если файл существует и он доступен для записи, в него записывается строка “Добавить это к файлу”, иначе выводится сообщение “Файл test.txt не доступен для записи”.

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

Синтаксис:

array stat(string $filename),

где $filename – имя файла.

Функция stat возвращает индексированный массив, содержащий статистиче¬скую информацию о файле “$filename”, заданного в ее параметре. В возвращаемом функцией массиве могут присутствовать элементы, представленные в таблице 6.1.

Таблица 6.1 - Получение информации о файле
Индекс массива Ассоциативное имя Информация
0 Dev Номер устройства
1 Ino Номер индексного узла
2 Mode Режим защиты индексного узла
3 nlink Количество ссылок
4 uid Пользовательский идентификатор владельца файла
5 gid Идентификатор группы владельца файла
6 rdev Тип устройства
7 size Размер в байтах
8 atime Время последнего доступа к файлу
9 mtime Время последней модификации содержимого файла
10 ctime Время последнего изменения inode-информации файла
11 blksize Размер блока ввода-вывода файловой системы
12 blocks Количество используемых блоков

Ниже приведен пример использования функции stat для получения размера файла в байтах (предполагается, что файл myfile.txt существует):

$my_file_stats = stat("myfile.txt") ;
$my_file_size = $my_file_stats[7];

Функция filetype возвращает тип файла.

Синтаксис:

string filetype(string $filename),

где $filename - имя файла.

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

  • file - обычный файл;
  • dir - каталог;
  • link - символическая ссылка;
  • block - блочно-ориентированное устройство;
  • char - символьно-ориентированное устройство;
  • unknown - неизвестный тип файла.

Для получения из PHP-сценариев полезной информации о файлах совместно с фукнцией filetype также можно использовать использовать фукнции:

  • fileowner - возвращает пользовательский идентификатор владельца заданного файла;
  • filegroup - возвращает идентификатор группы владельца заданного файла.

Каждая из них принимает единственный аргумент - имя файла.

Ниже представлен пример совместного использования функций filetype, fileowner и filegroup.

<HTML>
<HEAD>
<TITLE>Пример использования функций filetype, fileowner и filegroup</TITLE>
</HEAD>
<BODY>
<?php
$filename = "test.php";
$filegroup = filegroup($filename);
$fileowner = fileowner($filename);
$filetype = filetype($filename);
if ($filetype == 'dir')
{ echo "$filename является каталогом."; }
else if ($filetype == 'file') {
echo "$filename является файлом.<br>";}
else { echo "$filename не является ни файлом ни каталогом.<br>";
}
echo "$filename принадлежит пользователю № $fileowner и группе № $filegroup.<br>";
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.21.


Рисунок 6.21 – Проверка информации о файле на Windows-машине

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

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

Синтаксис:

int fileatime(string $filename)

где $filename - имя файла.

Функция fileatime определяет время последнего обращения к файлу “$filename”, заданному в ее параметре. В случае отсутствия файла, функция возвращает false. Время, возвращаемое функцией fileatime, выражается в количестве секунд и изменяется каждый раз, когда читаются данные файла.

Ниже представлен пример работы функции fileatime.

<HTML>
<HEAD>
<TITLE>Пример использования фукнции fileatime</TITLE>
</HEAD>
<BODY>
<?php
$counter_file = "test.txt";
if(file_exists($counter_file))
{
$date_str = getdate(fileatime($counter_file));
// определение времени и даты последнего доступа к файлу
$year = $date_str["year"];
$mon = $date_str["mon"];
$mday = $date_str["mday"];
$hours = $date_str["hours"];
$minutes = $date_str["minutes"];
$seconds = $date_str["seconds"];
$date_str = "$hours:$minutes:$seconds $mday/$mon/$year";
echo "Последнее посещение файла $counter_file состоялось $date_str";
}
// вывод на экран времени и даты последнего доступа к файлу
else
{
echo "Данного файла не существует.";
}
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.22.


Рисунок 6.22 - Отображение времени последнего доступа к файлу данных

Таким образом, как видно на рисунке 6.22, в данном примере с помощью функции fileatime было определено время последнего обращения к исходному файлу. В последний раз к файлу обращались 19.04.2010 в 23:9:1.

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

Функция filemtime возвращает время последней модификации содержимого файла или false в случае отсутствия файла.

Синтаксис:

int filemtime(string $filename)

где $filename - имя файла.

Функция filesize возвращает размер файла.

Синтаксис:

int filesize(string $filename)

где $filename - имя файла.

Функция filesize определяет размер файла “$filename”, заданного в ее параметре в байтах или возвращает false, если файла не существует.

Например, в представленном ниже коде

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

с помощью функции filesize был определен размер файла “pastry.txt” и на экран был выведен следующий результат:

Pastry.txt is 179 bytes.

Функцию filesize очень удобно использовать с другими функциями для определения свойств файлов, таких как filetype, filegroup, fileowner и fileatime. Ниже представлен совместный пример использования этих функций для отображения свойств файла “count.txt”.

<HTML>
<HEAD>
<TITLE>Пример использвания функций filetype, filegroup, fileowner, fileatime и filesize </TITLE>
</HEAD>
<BODY>
<?php
function date_str($timestamp) // функция преобразования даты в строку
{ $date_str = getdate($timestamp);
$year = $date_str["year"];
$mon = $date_str["mon"];
$mday = $date_str["mday"];
$hours = $date_str["hours"];
$minutes = $date_str["minutes"];
$seconds = $date_str["seconds"];
return "$hours:$minutes:$seconds $mday/$mon/$year";}
function file_info($file) // функция получения информации о файле
{ $file_info_array["filesize"] = number_format (filesize ($file) ) . " байт."; // определение размера
$file_info_array["filemtime"] = date_str(filemtime($file)); // определение времени последнего изменения файла
if(!isset($_ENV[WINDIR]))
{ $file_info_array["fileatime"] = date_str(fileatime($file));
// время последнего доступа к файлу
$file_info_array["filegroup"] = filegroup($file);
// идентификатор группы
$file_info_array["fileowner"] = fileowner($file);
// идентификатор пользователя}
$file_info_array["filetype"] = filetype($file);
// проверка является файлом или нет
return $file_info_array; }
$filename = "count.txt";
$file_info_array = file_info($filename);
echo "<center>Свойства файла $filename</center>";
foreach($file_info_array as $key=>$val)
{ echo ucfirst($key) . "=>" . $val . "<br>";} // вывод ключа и значения
?>
</BODY>
</HTML>

Результат работы данного кода представлен на рисунке 6.23.


Рисунок 6.23 – Определение свойств файла

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

Функция basename выделяет имя файла из переданного полного имени.

Синтаксис:

string basename(string $path),

где $path – полное имя файла (путь до файла и сам файл).

Функция basename выделяет имя файла из пути “$path”, переданного в ее параметре. Другими словами функция basename удаляет из полного имени путь и оставляет только имя файла. Функция basename может быть использована с различными параметрами.

Например, в представленном ниже коде

$fp= basename("/dir/catalog/myfile.txt");

с помощью функции basename переменной “$fp” присвоилось значение “myfile.txt”.

Ниже представлен пример работы функции basename.

<HTML>
<HEAD>
<TITLE>Пример использования функции basename</TITLE>
</HEAD>
<BODY>
<?php
echo basename("/home/somebody/example.txt");
echo "<BR>";
echo basename("/"); // ничего не выводится
echo "<BR>";
echo basename("/."); // вывод "."
echo "<BR>";
echo basename("/./"); // вывод "."
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.24.


Рисунок 6.24 – Получение имени файла из строки

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

Функция dirname выделяет имя каталога из пути.

Синтаксис:

string dirname(string $path),

где $path – имя каталога.

Функция возвращает имя каталога из пути “$path”, переданного в ее параметре. Другими словами, функция dirname дополняет функцию basename - она извлекает путь из полного имени файла. При этом если функции dirname передать просто имя файла, она вернет “.”, что означает текущий каталог. Функция

Например, в представленном ниже коде

$fp=dirname("/papka/test.txt");

с помощью функции dirname переменной “$fp” присвоилось значение “papka”.

Ниже представлен пример работы функции dirname

<HTML>
<HEAD>
<TITLE>Пример использования функции dirname</TITLE>
</HEAD>
<BODY>
<?php
echo dirname("/home/file.txt"); // вывод "/home"
echo "<BR>";
echo dirname("../file.txt"); // вывод ".."
echo "<BR>";
echo dirname("/"); // вывод "/"
echo "<BR>";
echo dirname("file.txt"); // вывод "."
?>
</BODY>
</HTML>

Реализация данного примера представлена на рисунке 6.25.


Рисунок 6.25 – Выделение имени файла из пути

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

Функция file считывает и загружает все содержимое файла в индексируемый массив.

Синтаксис:

list file(string $filename),

где $filename – имя файла.

Функция file осуществляет считывание файла “$filename”, заданного в ее параметре, в массив. При этом каждый элемент массива соответствует одной строке файла.

Например, в приведенном ниже коде

$arr=file("name.txt");

с помощью функции file был считан файл с именем “file.txt”. В результате получен массив, каждый элемент которого соответствует строке в считанном файле. После этого с помощью функции printf был реализован вывод содержимого массива на экран.

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

Ниже представлен пример работы функции file.

<HTML>
<HEAD>
<TITLE>Пример использования функции file</TITLE>
</HEAD>
<BODY>
<?php
$file_array =file("file.txt");
if(!$file_array)
{ echo("Ошибка открытия файла"); }
else
{ $num_str = count($file_array);
echo "Количество строк в файле $file равно $num_str"; }
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.26.


Рисунок 6.26 – Определение количества строк в файле

Таким образом, как видно на рисунке 6.26, в данном примере с помощью функции file было считано содержимое исходного файла. После этого с помощью функции count было подсчитано число строк в указанном файле, которое было выведено на экран, равное трем.

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

Синтаксис:

int fpassthru(int $fp),

где $fp - дескриптор открытого файла.

Функция fpassthru считывает содержимое файла “$fp”, заданного в ее параметре и распе¬чатывает его целиком в Web-браузер. Функция принимает единственный аргумент - дескриптор файла, который использует для считывания из файла оставшихся данных (то есть с теку¬щей позиции до конца файла). Затем она записывает результат в стандартный вы¬вод.

Ниже представлен пример работы функции fpassthru.

<HTML>
<HEAD>
<TITLE>Пример использования функции fpassthru </TITLE>
</HEAD>
<BODY>
<?php
$fp = fopen("book.txt","r");
echo ("<B>Содержимое файла book.txt:</B><BR>");
fpassthru($fp);
?>
</BODY>
</HTML>

Пример реализации данного кода представлен на рисунке 6.27.


Рисунок 6.27 – Вывод содержимого файла на экран

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

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

Ниже представлен пример работы функции fpassthru с графическим файлом.

<?php
$file = fopen("flower.jpg","r");
// открытие файла
if(!file)
{ echo("Ошибка открытия файла"); }
// проверка существования файла
else
{ fpassthru($file); }
// считывание и вывод содержимого файла"
?>

Реализация данного кода представлена на рисунке 6.28


Рисунок 6.28 – Считывание графического файла

Таким образом, как видно на рисунке 6.28, в данном примере с помощью функции fpassthru графический файл “flower.jpg” после открытия был считан в поток и выведен на экран.

Функция readfile читает файл и записывает его в буфер вывода.

Синтаксис:

int readfile(string $filename),

где $filename - имя файла.

Функция readfile позволяет распечатывать содержимое файла “$filename”, заданного в ее параметре, не вызывая функцию fopen. В качестве своего единственного аргумента она принимает имя “$filename”, считывает этот файл целиком, а затем распечатывает его в стандартный вывод, возвращая, при этом, количество считанных байт, или false в случае ошибки.

Например, в представленном ниже коде

$rest_file = "late.txt";
$res=readfile($rest_filе);

с помощью функции readfile содержимое файла “late.txt” и его размер были сохранены в переменную “$res”.

Ниже представлен пример работы функции readfile

<HTML>
<HEAD>
<TITLE>Пример использования функции readfile </TITLE>
</HEAD>
<BODY>
<?php
$n = readfile("book.txt");
echo "Содержимое файла book.txt и число символов:";
echo "<br>"; /* выводит на экран содержимое файла и
записывает его размер в переменную $n */
if (!$n) echo "Ошибка при чтении";
else
echo "$n"; /* вывод числа считанных символов */
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.29.


Рисунок 6.29 – Определение количества считанных символов

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

Функция copy копирует один файл в другой.

Синтаксис:

bool copy (string $file1, string $file2),

где $file1 - имя исходного файла,

$file2 - имя результирующего файла.

Функция copy копирует файл с именем “$file1” в файл с именем “$file2”, переданных в ее параметрах. При этом если файл “$file2” на момент копирования существовал, то он перезаписывается.

Ниже представлен пример работы функции copy.

<HTML>
<HEAD>
<TITLE>Пример использования функции copy </TITLE>
</HEAD>
<BODY>
<?php
$file1 = "C:/temp/index.html";
$file2 = "C:/temp/start.html";
if (file_exists($file1))
{
copy($file1, $file2);
echo "Файл $file1 был удачно скопирован";
}
else echo "Произошла ошибка при копировании файла $file1";
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.30.


Рисунок 6.30 – Копирование файла

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

После этого файл “C:/temp/index.html” был удачно скопирован в “C:/temp/start.html”.

Функция rename осуществляет переименование файла.

Синтаксис:

int rename (string $old, string $new),

где $old – старое имя файла,

$new – новое имя файла.

Например, в представленном ниже коде

rename ("/tmp/oldfile.txt", "/tmp/new.txt");

с помощью функции rename был переименован файл с именем “oldfile.txt” в файл с именем “new.txt”. При этом функция rename не осуществляет переименование файла, если его новое имя расположено в другой файловой системе.

Функция unlink осуществляет удаление файла.

Синтаксис:

bool unlink(string $filename),

где $fileaname – имя файла.

Функция unlink удаляет файл с именем “$filename”, переданный в ее параметре. В случае неудачи функция возвращает false, иначе - true.

Ниже представлен пример работы функции unlink.

<HTML>
<HEAD>
<TITLE>Пример использования функции unlink</TITLE>
</HEAD>
<BODY>
<?php
$file ="C:/ temp/index.html";
if (file_exists($file))
{
unlink($file);// удаление файла
echo "Файл $file был успешно удален";
}
else
echo "Произошла ошибка при удалении файла $file";
// вывод сообщения, если файла не существует
?>
</BODY>
</HTML>

Реализация данного примера представлена на рисунке 6.31.


Рисунок 6.31 - Удаление файла

Таким образом, как видно на рисунке 6.31, в данном примере с помощью функции unlink осуществлялось удаление исходного файла. В результате было выведено сообщение “Файл был успешно удален”. Если бы данного файла не существовало, пользователю бы было выведено сообщение “Произошла ошибка при удалении файла”.

Функция mkdir предназначена для создания каталога.

Синтаксис:

bool mkdir(string $name, int $perms),

где $name – имя каталога,

$perms – права доступа.

Функция mkdir создает каталог с именем “$name” и правами доступа “$perms”, заданных в ее параметрах.

Ниже представлен пример работы функции mkdir.

<HTML>
<HEAD>
<TITLE>Пример использования функции mkdir</TITLE>
</HEAD>
<BODY>
<?php
$flag=mkdir ("C:/temp/test", 0700);
if($flag)
{ echo("Каталог успешно создан"); }
else { echo("Ошибка создания каталога"); }
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.32.


Рисунок 6.32 – Создание каталога

Таким образом, как видно на рисунке 6.32, в данном примере с помощью функции mkdir был создан каталог c именем “test” и правами 0700 в директории “C:/temp”. При этом пользователю было выведено сообщение “Каталог успешно создан”.

Функция rmdir предназначена для удаления каталога.

Синтаксис:

bool rmdir(string $name)

где $name - имя каталога.

Функция rmdir удаляет каталог с именем “$name”, переданный в ее параметре. При этом каталог должен быть пустым. В случае успеха функция rmdir возвращает true, иначе - false.

Например, в представленном ниже коде

$f=rmdir("C:/temp/directoriya");
if($f)
{ echo("Каталог успешно удален"); }
else
{ echo("Ошибка удаления каталога"); }

в результате работы функции rmdir был удален каталог с именем “directoriya” и на экран выведено сообщение “Каталог успешно удален”, так как папка с таким именем существовала.

При этом если папка бы не существовала, на экран было выведено сообщение “Ошибка удаления каталога”.

Функция chdir предназначена для смены текущего каталога.

Синтаксис:

int chdir(string $directory),

где $directory – имя каталога.

Функция chdir устанавливает переход в каталог, заданный параметром “$directory”. Функция возвращает false, если не может сменить каталог, и true, если смена произошла.

Например, в представленном ниже коде

$name=chdir("papka");

переменной “$name” присвоилось значение “papka”.

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

chdir("C:/temp/"); // переход по абсолютному пути
chdir("./js"); // переход в подкаталог текущего каталога
chdir(".."); // переход в родительский каталог

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

Функция getcwd возвращает полный путь к текущему каталогу.

Синтаксис:

string getcwd();

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

Ниже представлен пример работы функции getcwd. <HTML>
<HEAD>
<TITLE>Пример использования функции getcwd</TITLE>
</HEAD>
<BODY>
<?php
$str= getcwd();
// определение полного путик каталогу
echo $str;
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунке 6.33.


Рисунок 6.33 – Определение полного пути к текущему каталогу

Таким образом, как видно на рисунке 6.33, в данном примере был определен полный путь к текущему каталогу. В результате на экран был выведен каталог, в котором запускается виртуальный сервер Apache.

Функция diskfreespace определяет свободное пространство в каталоге.

Синтаксис:

float diskfreespace (string $directory),

где $directory – имя каталога.

Данная функция возвращает в байтах свободное пространство в заданном каталоге “$directory”, то есть в соответствующей ей файловой системе или в разделе диска.

Например, в представленном ниже коде

$size=diskfreespace ("mycatalog");

с помощью функции diskfreespace переменной “$size” было присвоено значение, равное свободному пространству в каталоге “mycatalog”.

При этом чтобы определить размер корневой директории, можно использовать в качестве параметра “$directory” знак “/”.

Ниже представлен пример работы функции diskfreespace.

<HTML>
<HEAD>
<TITLE>Пример использования функции diskfreespace</TITLE>
</HEAD>
<BODY>
<?php
$diskspace=diskfreespace("/");
echo "Свободное пространство на текущем диске - $diskspace байт";
?>
</BODY>
</HTML>

Реализация данного примера представлена на рисунке 6.34.


Рисунок 6.34 – Оценка свободного места на диске

Таким образом, как видно на рисунке 6.34, в данном примере с помощью функции diskfreespace было определено свободное место в корневой директории.

Функция opendir используется для открытия каталога.

Синтаксис:

int opendir (string $path);

где $path - путь до каталога.

Функция opendir используется для того, чтобы открыть каталог, заданный параметром “$path”. Если путь не существует, или каталог, расположенный по указанному пути, не может быть открыт, функция opendir возвращает значение false.

Например, в представленном ниже коде

$dir = "/tmp/dog";
$dh = opendir($dir);

с помощью функции opendir был открыт заведомо существующий каталог “dog”. При этом содержимое этого каталога было занесено в переменную “dh”.

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

Синтаксис:

void closedir (int $dir),

где $dir – дескриптор открытого каталога.

Функция readdir используется для чтения каталога, открытого функцией opendir.

Синтаксис:

string readdir ( int $dir);

где $dir – имя каталога.

Функция readdir используется для того, чтобы прочитать каталог “$dir”, переданный в ее параметре. Функция возвращает имена элементов, содержащихся в этом каталоге.

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

Ниже представлен пример совместного использования функции readdir с функциями opendir и closedir.

<HTML>
<HEAD>
<TITLE>Пример использования функций opendir, readdir и closedir </TITLE>
</HEAD>
<BODY>
<?php
if ($handle = opendir("C:/WebServers/home/localhost/www/design"))
{echo "Файлы:<BR>";
while (($file = readdir($handle)) !== false) // считывание содержимого каталога
{ if ($file != "." && $file != "..") // проверка, чтобы имя файла не было ссылкой на текущий или родительский каталог
{ echo "$file<BR>";}} // // вывод имени файла
}
closedir($handle); } else
echo "Данная папка отсутствует";
?>
</BODY>
</HTML>

Реализация данного кода представлена на рисунках 6.35 и 6.36.


Рисунок 6.35 - Список файлов заданного каталога

Рисунок 6.36 - Список файлов без указания текущего и родительского каталога

Таким образом, как видно на рисунках 6.35 и 6.36, в данном примере с помощью функций readdir, opendir и closedir было реализовано чтение и вывод файлов и папок, находящихся в текущем каталоге. При этом на рисунке 6.35 представлен вариант, когда используются “.” и “..”, то есть ссылки на текущий и родительский каталоги. Как видно на рисунке 6.36, при выводе содержимого каталога эти ссылки не указываются, так как в данном случае текущий и родительский каталоги отсутствовали.

<<Глава 5 Глава 7>>

Наверх