Основные операции с файлами.

Открытие файла.

Функция fopen ( $filename, $mode) открывает файл (или URL) и возвращает его идентификатор. Данной функции нужно передать два параметра - имя файла ($filename) и режим ($mode), в котором необходимо открыть файл.

Имя файла - это обыкновенная строка. Можно указывать, как полный, так и относительный путь к файлу. При указании относительного пути используют каталоги ".." (две точки) - родительский каталог и "." (точка) - текущий каталог. Например:

./array.txt - файл находится в текущем каталоге;

../array.txt - файл находится в родительском каталоге;

../command/array.txt - файл находится в каталоге command родительского каталога.

Режимы открытия файла:

Режим

Описание

r

  Режим "только чтение". Можно только читать файл, но не изменять его. После открытия указатель файла устанавливается на его начало (первый байт). В случае, если файл не существует, функция возвращает false.

r+

  Файл открывается в режиме "чтение/запись". После открытия файла указатель устанавливается на его начало. Как и в режиме "r", если файл не существует, функция возвращает false. ВАЖНО: если в момент записи указатель файла находится где-то в середине файла, то записываемые данные будут записаны поверх уже имеющихся, а не будут "вставлены" между ними.

w

  Создает новый пустой файл. Если на диске уже есть файл с таким именем, то он будет перезаписан.

w+

  Напоминает режим "r+", но со следующими отличиями:
  • если файл не существует, он будет создан;
  • если файл существует, он будет перезаписан.

Можно как читать, так и перезаписывать данные в файл.

a

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

a+

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

b, t

  После любого из вышеперечисленных режимов может следовать один модификатор - b или t. Модификатор "b" указывает на то, что файл будет открыт в бинарном режиме, а "t" - в текстовом. Если модификатор не указан, по умолчанию файл открывается в бинарном режиме.

 

Конструкция or die()

Функция  fopen() возвращает false, если ей не удалось открыть файл: например указанный файл не существует. Проанализировать результат функции fopen() и если он не равен false, вывести работу сценария позволяет конструкция or die ($err_messeage). Синтаксис данной конструкции следующий:

<вызов_функции> or die ("сообщение об ошибке");

Если вызов функции неуспешен (функция возвратила false), будет выведено сообщение об ошибке и работа сценария будет завершена.

Примеры открытия файлов:

//  Открываем файл /home/den/counter.txt  в бинарном режиме "только чтение"

$f = fopen ("home/den/counter.txt", "r") or die ("Ошибка при открытии файла\n");

 

//  Открываем файл http://pranivpro.narod.ru/index.html  в текстовом режиме "только чтение"

$f = fopen ("http://pranivpro.narod.ru/index.html", "rt") or die ("Ошибка при чтении файла/\");

 

//  Открываем FTP - соединение в бинарном режиме для записи (с указанием логина и пароля)

$f = fopen )"ftp://user:123456@ftp.narod.ru", "r") or die ("Ошибка при открытии файла\n");

 

// Открываем журнал для добавления сообщения в конец файла (текстовый режим)

$f = fopen ("/home/den/counter.log", "a+t") or die ("Ошибка при открытии файла\n");

При открытии файла рекомендуется использовать конструкцию or die(), чтобы не анализировать результат открытия файла вручную. В случае ошибки (результат открытия файла - false) будет выведена строка, переданная функции die().

Чтение и запись в бинарном режиме. Функции fread() и fwrite().

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

Чтение двоичного (бинарного) файла осуществляется функцией fread(). Данной функции нужно передать всего два параметра - идентификатор файла и количество символов, которое нужно прочитать. Функция возвращает строку, в которой будут прочитанные символы. Если в качестве параметра функции будет указано большее число символов, чем есть в файле, то ошибки не будет - просто будет выведено все, что есть. Например:

<?
$f = fopen ("C:/text.txt", "r") or die ("Ошибка при открытии файла\n");
$s = fread ($f,100);
echo $s;
?>

Для записи символов в файл используется функция fwrite(), которой нужно передать два параметра - идентификатор файла и строку, которая будет записана в файл. Например:

<?
$f = fopen ("C:/text.txt", "a+") or die ("Ошибка при открытии файла\n");
$s = fread ($f,199);
echo $s;
fwrite ($f, "prokop2222");
$s = fread ($f,199);
echo $s;
?>

Чтение и запись текстовых файлов (построчное чтение и запись).

Для построчного чтения файлов используется функция fget (int $f, int $length), которая читает из файла $f строка длиной $length символов. Символ новой строки также включается в результат. Обычно функция используется в контексте, приведенном примере:

<?
$f = fopen ("C:/text.txt", "rt") or die ("Ошибка при открытии файла\n");
while (!feof ($f))
{
$s = fgets ($f, 255);
echo $s;
}
?>

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

Для записи строки в текстовом режиме используется функция fputs (int $f, string $s), которая записывает строку $s в текстовый файл $f.

Закрытие файлов. Функция fclose().

Функция fclose ($f) - закрывает файл $f. Обычно закрытие файла не требуется, т.к. PHP сам закрывает файлы. Однако, желательно закрывать файлы вручную. Закрытие файла требует этика программирования.

Функция file(). Чтение файла в список.

Функция file (string $filename) читает весь файл в список, каждый элемент которого равен строке, прочитанного из файла. Например, имеем файл lines.txt:

Line1\n

Line2\n

Line3

После вызова $list = file ("lines.txt")  в массиве $List будет три элемента: "Line1\n", "Line2\n", "Line3". Данная функция не вырезает символы новой строки и не выполняет их трансляцию.

Чтение файлов в строку. Функция join().

Функция join (string $sss, array $maslist) возвращает строку, содержащую последовательно расположенные все элементы массива $maslist. Первый параметр функции $sss - это разделитель элементов массива, то есть символ (символы), который будет вставляться в строке между элементами массива. Пример чтения всего файла в одну строку с помощью функций file() и join():

<?

$s= join (" ", file("C:/text.txt"));

echo $s;

?>

Пример чтения HTML - файла с удалением из него всех тэгов:

<?

$Index = join ("", file("c:/text.html"));

$Index = strip_tags ($Index);

echo  $Index;

?>

Чтение CSV - файлов. Функция fgetcsv (int $file, int $length, char $separator = ",").

Программы электронных таблиц (включая Excel от Microsoft) позволяют сохранять электронные таблицы в формате CSV. Особенностью CSV-формата является использование запятой в качестве разделителя. Если заполнить четыре ячейки электронной таблицы (A1, A2, B1, B2 - значения "A1", "a2", "B1", "B2"), а потом сохранить таблицу в формате CSV, то получим файл электронной таблицы. Для чтения CSV-файлов используется функция fgetcsv (int $file, int $length, char $separator = ","). Функция читает одну строку из файла $file и разбивает ее по символу $separator, который по умолчанию равен "," (запятой). Функция возвращает список или false, если достигнут конец файла. Параметр $length задает максимальную длину строки. Например:

$f = fopen ("Книга1.csv", "r") or die ("Невозможно открыть файл");

echo "<PRE>";

for ($i=0, $array = fgetcsv ($f, 1024); $i++)

{

$j = count ($array);

if ($j ==1 && array[0]==="") continue;

for ($k=0, $k<$j, $j++) echo "$array[$k]";

echo "<BR>";

}

fclose($f);

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

PHP предоставляет разнообразные функции для работы с файлами:

Функции манипулирования файлами.

К данной группе относятся функции копирования, переименования, удаления файлов.

Функция copy (string $source, string $dest) - используется для копирования файлов. Эта функция копирует файл с именем $source  в файл с именем $dest. Если файл $dest существует, он будет перезаписан, поэтому изначально необходимо проверить существование файла с помощью функции file_exists().

Функция copy() возвращает true, если файл удачно скопирован, и false - если нет.

Функция rename (string $oldname, string $newname) - переименовывает файл $oldname  в файл с именем $newname. В случае, если файл переименовать нельзя, функция возвратит false. Это может произойти в следующих случаях:

Функция unlink (string $name) - удаляет файл. Функция возвращает false, если файл не удалось удалить.

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

Основные функции:

Функция file_exists (string $name) - проверят существование файла с именем $name:

<?

if (!file_exists ("C:/text.txt"))

{

echo "Файл не существует";

}

else echo "Файл существует";

?>

Функция basename (string $full_filename) возвращает основное имя файла, то есть имя без пути к нему:

echo basename ("C:/text.html"); // выведет text.html

echo basename ("/.");  // выведет "." (точку)

Функция dirname (string $path) возвращает имя каталога:

echo dirname ("/home/den/text.txt");  //  выведет /home/den

echo dirname ("../line.txt");  //  выведет ".." (две точки)

echo dirname ("text.txt");  //  выведет "." (точка - текущий каталог)

echo dirname ("/swap_file");  //  выведет / (слэш прямой) - в Linux, и \ (слэш обратный) - в Windows

Функция realpath() преобразует относительный путь к файлу в абсолютный (полный)"

echo realpath ("./text.html");  //  выведет /home/den/text.html

Функция tempname (string $dir, string $prefix) генерирует имя файла в каталоге $dir с префиксом $prefix, причем делает это так, что получаемое имя файла уникально. В качестве аргумента $dir обычно указывается временный каталог, в качестве $prefix - имя сценария (чтобы знать, какая программа сгенерировала файл), но это необязательно - можно указать все, что угодно:

$fname = tempname ("var/www/html/tmp", "dev");

Функции определения типа и параметров файла. Функция filetype().

Функция filetype (string $filename) используется для определения типа файла, которая возвращает - строку:

Возвращаемое значение

Тип файла

file

  Самый обыкновенный файл. Может быть, как текстовым, так и двоичным.

dir

  Каталог.

link

  Символическая ссылка.

fifo

  FIFO - канал.

block

  Блочно-ориентированное устройство (например: жесткий диск - /dev/hddN).

char

  Символьно-ориентированное устройство (например: терминал - /dev/ttyN).

unknown

  Тип определить не удалось.

Функция stat (string $filename) используется для определения параметров файла, которая возвращает подробную информацию о файле - возвращает массив, состоящий из тринадцати элементов:

Ключ массива

Значение

0

  Устройство.

1

  Номер incode.

2

  Атрибуты файла.

3

  Число жестких ссылок на файл.

4

  Числовой идентификатор (User ID - UID) владельца файла.

5

  Числовой идентификатор группы (Group ID - GID) владельца файла.

6

  Тип устройства.

7

  Размер файла в байтах.

8

  Время последнего доступа (с января 1970 года) в секундах.

9

  Время последнего изменения файла.

10

  Время последнего изменения атрибутов файла.

11

  Время блока.

12

  Число блоков, которые занимает файл.

Пример сценария собирающего детальную информацию о файле:

<?

$f_info = stat ("C:/text.html");

echo "Файл: C:/text.html\n";

echo "Устройство: \t\t$f_info[0]\n";

echo "Номер incode: \t\t$f_info[1]\n";

echo "Атрибуты \t\t$f_info[2]\n";

echo "Число жестких ссылок: \t$f_info[3]\n";

echo "UID $f_info[4] GID $f_info[5]\n";

echo "Тип устройства: \t$f_info[6]\n";

echo "Размер: \t\t$f_info[7]\n";

echo "Время последнего доступа: ".date ("d M Y H:i:s", $f_info[8])."\n";

echo "Время последнего изменения файла: ".date ("d M Y H:i:s", $f_info[9])."\n";

echo "Время последнего изменения атрибутов файла: ".date ("d M Y H:i:s", $f_info[10])."\n";

echo "Размер блока: $f_info[11]\n";

echo "Число блоков, которые занимает файл: $f_info[12]\n";

?>

Специальные функции.

Функция fileatime (string $filename) - возвращает время последнего доступа (a - access) к файлу. Если файл не существует, она возвращает false.

Функция filectime (string $filename) - возвращает время создания (c - create) файла.

Функция filemtime (string $filename) - возвращает время последнего изменения (m - modify) файла.

Примеры использования данных функций:

$A = fileatime ("text.txt");

$C = filectime ("text.txt");

$M = filemtime ("text.txt");

echo "Время последнего доступа: ".date ("d M Y H:i:s", $A)."\n";

echo "Время создания файла: ".date ("d M Y H:i:s", $C)."\n";

echo "Время последнего изменения файла: ".date ("d M Y H:i:s", $M)."\n";

Функция touch (string $filename, int $time) - позволяет установить для файла $filename время последней модификации $time. Если последний параметр не указан, то используется текущее время.

Запись данных в начало файла.

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

Пример демонстрирующий организацию записи в начало файла (гостевая книга):

<?

$file_gb = "gb.txt";  //  файл гостевой книги

$file_tmp = "gb_tmp.txt";  //  временный файл

$str = "новая строка текста";

//  проверяем, не было ли сбоя в предыдущем запуске скрипта

if (file_exists ($file_tmp)) die ("Временный файл существует!");

// копируем содержимое файла в tmp

if (copy ($file_gb, $file_tmp))

{

//  если удачно скопировался, можно перезаписать основной файл

if ($w=fopen($file_gb, "w"))

{

flock($w,2);  // блокируем файл

fwrite ($w, $str."\n");  //  записываем первую строку

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

flock ($r,1);

while ($str=fgets($r, 10240))  //  читаем построчно

{

fputs ($w, $str);  //  пишем построчно

}

flock ($r,3);

fclose ($r);

flock ($w,3);

fclose ($w);

unlink ($file_tmp);  //  удаляем временный файл

}

}

?>

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

Манипуляции с каталогами.

Открытие, чтение и закрытие каталогов.

В PHP есть три функции для этих целей:

Пример использования всех трех функций:

<?

$dir = opendir ("C:/www");

chdir ("C:/www");

echo "<html><head><title>Печать каталога</title></head><body>";

echo "<h1>Оглавление каталога</h1><p>";

echo "<table width=100%>";

while ($d=readdir ($dir))

{

echo "<tr><td>";

if (is_dir ($d)) echo "$</td><td>Каталог</td>";

if (is_file ($d)) echo "$d</td><td>".filesize($d)."</td>";

echo "</tr>";

}

echo "</table></body></html>";

closedir ($dir);

?>

Анализ данной программы: открываем каталог (opendir), затем делаем его текущим (chdir). В цикле while ($d = readdir($dir)) читаем каталог и анализируем его записи - $d. Если $d - это каталог (is_dir), выводим в соответствующую ячейку таблицы слово "Каталог", если $d - файл (is_file), то выводим его размер (filesize). Прочитав все записи каталога - закрываем (closedir).

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

Для каждого файла и каталога в ОС Linux (Unix) и ОС Windows задаются права доступа,  которые определяют, кто имеет доступ к объекту и какие операции над объектом можно выполнять. Под объектом понимаются файлы и каталоги. Выполнять можно три операции: чтение, запись и выполнение.

PHP предоставляет функции прав доступа к файлу:

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

Блокировка доступа. Функция flock (int $f, int $operation, [$block]).

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

Для блокировки файла в PHP используется функция flock (int $f, int $operation, [$block]). В качестве первого параметра указывается дескриптор блокируемого файла ($f) для текущего процесса, а в качестве второго ($operation) - режим блокировки. Второй параметр может принимать следующие значения:

Функция flock() устанавливает для файла флаг, который говорит о том, что с файлом ведется работа. Другой сценарий (программа) при обращении к этому файлу прочитает этот флаг и сделает соответствующие выводы. Применение данной функции возможно только к открытому файлу. При записи в файл с применением блокировки лучше использовать режимы "r+" и "a+", но не "w".

 

 

 

 

 

Hosted by uCoz