Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

CGI-программирование с самого начала


Уважаемые подписчики!

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

Удаление файла

Для удаления файлов в Perl применяется функция unlink:

unlink СПИСОК_ФАЙЛОВ

например,

$num=unlink "data.txt"; # удалить файл data.txt
$num=unlink "data1.txt", "data2.txt", "data3.txt"; # удаить эти файлы
$num=unlink @files; # удалить файлы с именами, хранящимися в массиве @files

В качестве результата функция возвращает количество удаленных файлов.

Остается только отметить, что функция unlink не предназначена для удаления каталогов - для этого надо использовать функцию rmdir:

rmdir ИМЯ_КАТАЛОГА

Функция rmdir удаляет каталог, если он пустой; возвращает "истину" в случае успеха или "ложь" в противном случае.

Переименование файла

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

rename СТАРОЕ_ИМЯ, НОВОЕ_ИМЯ;

Функция возвращает "истину" в случае успеха или "ложь" - в противном случае.

Создание каталога

Каталог создается с помощью функции mkdir:

mkdir ИМЯ КАТАЛОГА

Функция возвращает результат, аналогичный remane и rmdir.

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

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

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

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

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

Перед тем, как прочитать содержимое каталога, его необходимо открыть функцией opendir:

opendir ДЕСКРИПТОР, ИМЯ_ПАПКИ

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

Функция readdir служит собственно для чтения содержимого каталога:

readdir ДЕСКРИПТОР

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

По окончании чтения каталога его необходимо закрыть функцией closedir:

closedir ДЕСКРИПТОР

Существуют также функции управления указателем:

telldir ДЕСКРИПТОР - возвращает текущую позицию указателя;

seekdir ДЕСКРИПТОР, ПОЗИЦИЯ - устанавливает указатель в данную позицию;

rewinddir ДЕСКРИПТОР - сбрасывает указатель в начало каталога.

Пример 1: вывод содержимого каталога

#!/usr/bin/perl

opendir DIR,".";
 @files=readdir DIR;
closedir DIR;

print "Content-Type: text/html\n\n";
print "<TABLE>";
foreach $itm (@files) {
print "<TR><TD>$itm</TD></TR>\n";
};
print "</TABLE>";

Этот CGI-скрипт, будучи запущен на сервере, выдаст Вам содержимое каталога, в котором он находится, в виде таблицы.

Функции проверки файла

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

-X ФАЙЛ

где X - буква, обозначающая проверяемое условие (см. ниже). В качестве параметра ФАЙЛ можно указывать как имя файла, так и его дескриптор (если он открыт).

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

-e - файл существует
-d - файл является каталогом
-r -w -x - файл доступен скрипту соответственно для чтения, записи и исполнения
-o - скрипт является владельцем файла (вернее, владельцем файла является пользователь, от имени которого запущен скрипт)
-z - файл имеет нулевой размер
-s - файл имеет ненулевой размер (возвращает размер в байтах).

С помощью этих операторов, например, можно перед открытием файла на чтение проверить, существует ли он:

if (-e "data.txt") {open DATA, "<data.txt"};

Пример 2: выбор имени для временного файла

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

Единственный способ организовать такую "развязку" - создавать временный файл с динамическим именем - либо псевдослучайным, либо сгенерированным по каким-то другим правилам. На мой взгляд, простейшим способом является создание файла с шаблоном имени, включающим в себя порядковый номер - скажем, от 0 и выше. Например, file0.tmp, file1.tmp и т.д. Скрипт при этом действует методом перебора: начиная от file0.tmp, скрипт проверяет "занятость" имени до тех пор, пока не "наткнется" на свободное имя, которое он и будет использовать для своего файла:

$tmpnum=0;          # Сбрасываем счетчик имен
$tmpname="file".$tmpnum.".tmp"; # Текущее проверяемое имя

while (-e $tmpname) {
 $tmpnum++;          # Увеличиваем счетчик на 1
 $tmpname="file".$tmpnum.".tmp"; # Формируем имя
 };

open TMP, ">$tmpname";          # Открываем временный файл

# *** код, работающий с временным файлом TMP ***

close TMP;

# После работы с временным файлом его необходимо удалить:

unlink $tmpname;

Пример 3: вывод информации о файлах и каталогах

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


#!/usr/bin/perl

opendir DIR,".";
 @files=readdir DIR;
closedir DIR;

print "Content-Type: text/html\n\n";
print "<TABLE>";
foreach $itm (@files) {
print "<TR><TD>$itm</TD><TD>";
if (-d $itm){print "---DIR---";} else {print -s $itm;}
print "</TD></TR>\n";
};
print "</TABLE>";

На сегодня пока все. В заключение хочу Вам напомнить, что на нашем сайте рассылки http://www.cgi-scripts.info/ Вы можете найти статьи по CGI-программированию на Perl, а также готовые CGI-скрипты на Perl, которые Вы можете использовать на своих сайтах.

А на другом нашем сайте: http://www.angel07.webservis.ru/< /B> Вы можете найти информацию о хостинге: статьи по вопросам хостинга и описание хороших и недорогих хостинг-провайдеров.

До следующих встреч!

Успехов!


Андрей
angel07@inbox.ru

В избранное