Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в Windows может использоваться как прямой (/
), так и обратный (\
) слеш. В других операционных системах используется только прямой слеш.
Запись и считывание данных из файла производится в три этапа:
- Открытие файла. Если файл не существует его надо создать. Если файл нельзя открыть, ситуация должна быть распозднана и предусмотрен корректный выход из нее.
- Запись или чтение данных.
- Закрытие файла.
Открытие файла
Для открытия файла в среде РНР используется функция
fopen(имя_файла, режим_файла)
При открытии файла необходимо указать, как его предполагается использовать. Это называется режимом файла. Серверная операционная система должна знать, что нужно делать с открытым файлом. Режимы файла предоставляют операционной системе механизм для определения способа обработки запросов на доступ, поступающих от пользователей или сценариев, а также метод проверки наличия доступа и прав для работы с конкретным файлом.
Первым параметром функции fopen()
должно быть имя файла, который необходимо открыть, вторым — код режима, который может принимать следующие значения:
Режим | Описание |
---|---|
r |
Файл открывается только для чтения. Если файла не существует, вызов регистрирует ошибку. После удачного открытия указатель файла устанавливается на его начало; |
r+ |
Файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на его начало. Как и для режима r , если файла не существует, возвращается false . Следует отметить, что если в момент записи указатель файла установлен где-то в середине файла, то данные запишутся прямо поверх уже имеющихся, а не "раздвинут" их, при необходимости увеличив размер файла. Будьте внимательны; |
w |
Открывает файл только для записи и помещает указатель в начало файла. Если файл не существует создает новый пустой файл. Если на момент вызова уже был файл с таким именем, то он предварительно уничтожается. В случае неверно заданного имени файла вызов, как нетрудно догадаться, "проваливается"; |
w+ |
Аналогичен r+ открывает файл только для записи и помещает указатель в начало файла, но если файла изначально не существовало, создает его. После этого с файлом можно работать как в режиме чтения, так и записи. Если файл существовал до момента вызова, его содержимое удаляется; |
a |
Открывает существующий файл только для записи, и при этом сдвигает указатель текущей позиции за последний байт файла. Этот режим полезен, если требуется что-то дописать в конец уже имеющегося файла. Как водится, вызов неуспешен в случае отсутствия файла; |
a+ |
Открывает файл для чтения и записи, указатель файла устанавливается на конец файла, при этом содержимое файла не уничтожается. Отличается от a тем, что если файла изначально не существовало, то он создается. Этот режим полезен, если вам нужно что-то дописать в файл (например, в журнал), но вы не знаете, создан ли уже такой файл; |
x |
Создает и открывет файл только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей. Если файл не существует попытается его создать. |
x+ |
Создает и открывет файл для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей. Если файл не существует попытается его создать. |
При работе в операционной системе Windows также можно явно указать, содержит ли файл двоичные (b
) или текстовые (t
) данные. В этом случае следует добавить "b
" или "t
" к строке режима. Если вы записываете текстовые данные в файл Windows и укажите режим "a+t
", то строки будут разделяться символами \n\r
, как и положено Windows.
В случае удачного открытия файла, функция fopen()
возвращает дескриптор файла, в случае неудачи - false
. Дескриптор файла представляет собой указатель на открытый файл, который используется операционной системой для поддержки операций с этим файлом. Возвращенный функцией дескриптор файла необходимо затем указывать во всех функциях, которые в дальнейшем будут работать с этим файлом.
Пример:
<?php
$fl=fopen("170.php", "r"); //возвращает Resource id #3
if(!$fl)
{
echo "Ошибка при открытии файла";
}
echo $fl;
?>
Открытие двоичного файла, к примеру, рисунка происходит таким же образом, только с флагом b
:
<?php
$fl=fopen("images/foto15.gif", "rb"); //возвращает дескриптор Resource id #3
if(!$fl)
{
echo "Ошибка открытия файла";
}
echo $fl;
?>
Конструкция or die
Давайте изменим приведенные выше скрипты:
<?php
// открываем файлы на чтение
$fl=fopen("170.php", "r") or die("Ошибка!");
echo $fl. "<br>";
$fl=@fopen("images/fot15.gif", "rb") or die("Ошибка!");
echo $fl;
?>
В приведенном примере обратите внимание на конструкцию or die()
. Ее особенно удобно применять при работе с файлами. Оператор or аналогичен ||
, но имеет очень низкий приоритет(даже ниже чем у =), поэтому в нашем примере всегда выполняется уже после присваивания.
То, что or обозначает логическое ИЛИ
в нашем случае не так интересно(ибо возвращаемое значение просто игнорируется). Нас же интересует другое свойство оператора: выполнить второй операнд только в случае ложности первого. Если файл открыть не удалось fopen()
возвращает false
, а значит осуществляется вызов die()
на другом конце оператора or
.
Отображение файлов
Содержимое открытого файла можно отобразить в браузере с помощью функции
fpassthru(дескриптор_файла)
Пример:
<?php
$fl=fopen("phpstage2.html", "rb"); //возвращает дескриптор Resource id #3
if(!$fl)
{
echo "Ошибка открытия файла";
}
else
{
fpassthru($fl); //возвращает phpstage2.html
}
?>
Для текстовых файлов существует еще одна функция отображения
readfile(имя_файла)
Функция открывае файл, читает все его содержимое и выводит содержимое файла в окно браузера. В качестве аргумента эта функция принимает имя файла, а не его дескриптор.
Пример:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Отображение файлов</title>
</head>
<body>
<?php
readfile("../../javascript/test/239.html");
?>
</body>
</html>
В окне веб-браузера это будет выглядеть ТАК.
Запись в файлы
Запись в файлы осуществляется функциями fputs()
и fwrite()
, которые абсолютно идентичны.
fputs(дескриптор_файла, строка[, количество_ символов])
fwrite(дескриптор_файла, строка[, количество_ символов])
Первый параметр - дескриптор файла, в который осуществляется запись. Второй параметр представляет собой строку, которая должна быть записана в файл. Третий необязательный параметр задает количество_символов в строке, которые должны быть записаны. Если третий параметр не указан, записывается вся строка.
Функция возвращает количество записанных байтов или false
в случае ошибки.
Пример:
<?php
//открываем файл для чтения
$fd=fopen("file.txt","r");
//записываем файл
fwrite($fd, "Привет, всем!");
//закрываем файл
fclose($fd);
?>
Если необходимо записать содержимое файла в массив, применяется функция file()
:
array file(string filename [, int use_include_path])
— считывает файл с именем filename
и возвращает массив, каждый элемент которого соответствует строке в прочитанном файле. В приведенном ниже примере с помощью функции читается файл, информация из которого затем выводится в браузер.
Использование функции file()
<?php
$content=file("file.txt");
foreach($content as $line) echo "$line <br>";
?>
Эта функция удобна также тем, что с ее помощью можно подсчитать количество строк в файле.
Подсчет количества строк в файле
<?php
$content=file("file.txt");
echo count($content);
?>
Закрытие файлов
После того, как вы закончите работу с файлом его необходимо закрыть. Закрытие файлов осуществляется с помощью функции
fclose(дескриптор_файла)
Эта функция возвращает значение true
в случае успешного закрытия файла и false
, если файл не был закрыт.
Пример:
<?php
$fl=fopen("../../javascript/test/239.html", "w");
$t="Строка, которая будет записана в файл.\n";
$res=fwrite($fl, $t); // возвращает количество записанных байтов: 70
echo($res);
fclose($fl); //возвращает true
?>
В окне веб-браузера это будет выглядеть ТАК.
Чтение из файлов
Прочитать строку из открытого файла можно с помощью функции
fread(дескриптор_файла, длина_строки)
Эта функция читает столько байтов из файла, сколько ей предписывает второй параметр длина_строки, если раньше не встретиться конец файла.
Пример:
<?php
$fl=fopen("../../javascript/test/239.html", "r+");
$cont=fread($fl,38); //возвращает строку длиной 38 символов
echo($cont);
fclose($fl); //возвращает true
?>
В окне веб-браузера это будет выглядеть ТАК.
Для чтения из файла можно также пользоваться функцией
fgets(имя_файла, длина_строки)
Первый параметр этой функции имя_файла — указатель на файл, второй длина_строки — длина строки в байтах. Функция возвращает строку размером 1 байт, прочитанную из указанного файла. Чтение заканчивается, когда количество прочитанных байтов достигает — 1, по достижении конца строки или по достижении конца файла что бы ни встретилось первым. Если длина строки не указана, по умолчанию ее значение равно 1Кбайт.
Пример:
<?php
$fl=fopen("phpstage2.html", "r");
$cont=fgets($fl, 85); //возвращает строку
echo $cont;
fclose($fl); //возвращает true
?>
В результате выполнения этого сценария удастся прочитать только одну строку.
При открытии файла внутренний указатель устанавливается на начало файла и передвигается по файлу по мере чтения. Для чтения всего файла потребуется функция feof()
, которая проверяет, не достиг ли указатель конца файла.
feof(дескриптор_файла)
Пример:
<?php
$fl=fopen("phpstage2.html", "r");
if(!$fl)
{
echo "<p>Ваш заказ не удается обработать сейчас </p>";
exit;
}
while(!feof($fl))
{
$cont=fgets($fl);
echo $cont;
}
fclose($fl);
?>
Кроме описанных выше базовых функций для работы с файлами, в РНР есть несколько функций, объединяющих действия, выполняемые базовыми функциями.
file_get_contents(имя_файла)
Функция позволяет получить содержимое файла в виде одной строки.
Пример:
<?php
echo file_get_contents("phpstage2.html");
?>
Копирование, переименование и удаление файлов
Копирование файлов осуществляется функцией
copy(файл1, файл2)
Функция копирует файл с именем файл1
в файл с именем файл2
. Если файл файл2
на момент копирования существовал, то он перезаписывается.
<?php
copy("file1.php", "file2.php");
?>
Переименование файла производится с помощью функции
rename(файл1, файл2)
Эта функция переименовывает файл с именем файл1
в файл с именем файл2
. Функция rename()
не выполняет переименования файла, если его новое имя расположено в другой файловой системе.
Пример:
<?php
rename("file2.php", "file1.php");
?>
Файл file2.php
переименован в файл file1.php
.
Удаление файла осуществляется посредством функции
unlink(имя_файла)
Атрибуты файлов
file_exists(имя_файла
) — проверяет, существует ли файл и возвращаетtrue
, если файл существует иfalse
в противном случае.fileatime(имя_файла)
— возвращает время последнего обращения к файлу.filemtime(имя_файла)
— возвращает время последней модификации содержимого файла.filesize(имя_файла)
— возвращает размер файла в байтах.-
filetype(имя_файла)
— возвращает тип файла.Строка, возвращаемая этой функцией, содержит один из следующих типов файла:
char (специальное символьное устройство);
dir (каталог);
fifo (именованный канал);
link (символическая ссылка);
block (специальное блочное устройство);
file (обычный файл);
unknown (тип не установлен).
-
Поскольку использование функций, возвращающих характеристики файла, весьма ресурсоемко, во избежание потери производительности при вызовах таких функций, PHP кэширует информацию о файле. Очистить этот кэш можно с помощью функции
clearstatcache()
.
Работа с каталогами
Для установки текущего каталога применяется функция
chdir(директория)
Пример:
<?php
echo chdir("D:/sevidi/images/"); // возвращает true
?>
Чтобы узнать текущий каталог используется функция
getcwd(параметр_path)
Создание каталогов производится с помощью функции
mkdir(директория/каталог, код_доступа)
Эта функция создает каталог с именем каталог и правами доступа код_доступа. В случае неудачи возвращает false
. Права доступа задаются только для каталогов UNIX, поскольку в Windows этот аргумент игнорируется.
<?php
$flag=mkdir("D:/site/test", 0700);
if($flag)
{
echo "Каталог успешно создан";
}
else
{
echo "Ошибка в создании каталога";
}
?>
Удалить каталог можно с помощью функции rmdir(директория/каталог).
Теперь удалим только что созданный каталог /test:
<?php
$flag=rmdir("D:/site/test");
if($flag)
{
echo "Каталог успешно удален";
}
else
{
echo "Ошибка удаления каталога";
}
?>
Блокировка файла
Попытка двух сценариев одновременно вносить записи в один и тот же файл может привести к непредсказуемым результатам. Идеальным решением этой проблемы в случае, когда объем данных велик, является хранение данных на сервере баз данных, который имеет механизм обеспечения целостности данных, но в случае работы с небольшими файлами целесообразно использовать функции блокировки.
Применяются два вида блокировки:
- блокировка чтения — этот общепринятый русский термин не передает смысла действия. Суть в том, что этот вид блокировки запрещает двум и более приложениям вести одновременную запись данных, но чтение файла несколькими приложениями одновременно в этом режиме разрешено;
- блокировка записи означает введение режима, при котором чтение и запись разрешены только одному приложению.
Функция
flock(дескриптор_файла, код_режима)
осуществляет блокировку файла, идентификатор которого указан в ее первом параметре дескриптор_файла
. Второй ее параметр код_режима
содержит код режима блокировки.
Значение | Описание |
---|---|
1 | Блокировка чтения |
2 | Блокировка записи |
3 | Снятие существующей блокировки |
+4 | Добавление 4 к текущему значению параметра предотвращает другие попытки блокирования во время выполнения текущего блокирования |
Пример:
<?php
$fl=fopen("192.php", "w+");
flock($fl, 1);
?>
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться