Главная
домен в подарок! подробнее

каталог сайтов www.poiu.ru закрыт. копия сайта www.myphp.net.ru сделана мной без согласия автора, подробнее тут


Уроки PHP.

Урок 6. Файлы, директории и PHP

Работа с файлами

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

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

file_exists

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

if ( !file_exists("somefile.txt") ) exit("Указанный файл не существует");

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

Вот некоторые правила описания пути к файлу.

filename

Просто указание имени файла означает, что он находится в текущей директории.

./files/filename

Файл содержится в папке files, находящейся в текущей директории. Длина цепочки из папок не ограничена.

../filename

Файл лежит в предыдущей директории. Каждый знак ../ расценивается как возврат в родительскую директорию.

../files/filename

Файл находится в папке files, которая лежит в предыдущей директории.

filesize

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

file

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

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

$text_file = implode("", file("somefile"));
echo $text_file;

readfile

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

$bytes = readfile ("somefile");
echo "Итого - ".$bytes." символов";

fopen

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

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

  • "r"
    Файл открывается только для чтения его содержимого.

  • "r+"
    Открытие файла как для чтения, так и для записи.

  • "w"
    Файл открывается с целью записи.

  • "w+"
    Открыть файл для чтения и записи.

  • "a"
    Файл открывается для записи в конец файла (дозаписи).

  • "a+"
    Открывается для дозаписи и чтения.

fgets

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

Заметьте, что функция fgets использует дополнительный параметр length, который указывает максимальную длину строки файла для чтения. Если объем строки превышает это число, то функция возратит ее в "урезанном" виде объемом в число length байт. По умолчанию этот параметр установлен в 1024 байт, или в один килобайт. Тем более обратите внимание на этот параметр, если вы используете файлы больших размеров, так как при чтении таких файлов может переполниться буфер выполнения PHP (его объем указывается в файле конфигурации), что приведет к зависанию.

$file = fopen ("somefile", "r");
while ($line = fgets($file, 4096) )
{
  $line.="\n";
  echo $line;
}
следующие команды работы с файлом

Обратите внимание, что в качестве указания файла для чтения необходимо указывать не имя файла, а идентификатор соединения с файлом, возвращенный функцией fopen (в нашем примере это значение переменной $file).

fputs

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

fclose

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

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

<?
$file = fopen("counter.txt", "r");
$c = fgets ($file, 150); 
fclose ($file); 
$c++; 
$file = fopen("counter.txt", "w"); 
fputs ($file, $c); 
fclose ($file); 
echo $c;
?>

Работа с директориями

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

opendir

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

 .

Точка означает открытие текущей директории

./files/

Открытие папки files, находящейся в текущей директории

..

Открытие папки на уровень выше текущей

readdir

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

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

closedir

Закрываем директорию, указывая в качестве аргумента идентификатор соединения с папкой.

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

$i = 0;
$handle = opendir ('.');
while($file = readdir($handle))
{
  if ($file != '.' && $file != '..')
  {
    $func[$i] = $file;    //формируем массив названий файлов с функциями
    $i++;
  }
}
sort
($func);
for ($q = 0; $q<sizeof($func); $q++)
{
  echo "<a href='index.php?".$func[$q]."'>".$func[$q]."</a><br>\n";
}

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

На этом все. Встретимся на следующем уроке.

Назад, на урок 5

Дальше, на урок 7