Контакты

Для связи с нами можно использовать:
irc://irc.chatnet.ru:#gfs
icq://546460
email://cobalt[@]gfs-team.ru

Все материалы предоставлены только с ознакомительной целью
ГлавнаяСтатьиКодингPerl. Работа с файлами
© Cobalt 23.05.2006 статья не оптимизирована

 Функции для работы с файлами играют довольно большую роль во всех языках
програмирования. Ни один серьезный проект не обходится без их применения. В Perl
эти функции представлены довольно широко. В этой статье я постараюсь рассказать
тебе о них.

 Открытие/закрытие файлов
 В Perl файл открывается как поток. Для последущего обращения к этому потоку
при открытии создается так называемый дискриптор файла. Например:

 open(PASSWD, "/etc/passwd");
 
 Тут мы открыли на чтение файл /etc/passwd и связали его с дискриптором PASSWD.
Но как не трудно догадаться Perl позваляет открывать файлы не только для чтения.
Чтобы указать права с которыми требуется открыть файл надо использовать
следущие указатили:

   <       - только чтение
   >       - только запись (файл усекается до нулевой длинны)
   +<      - чтение/запись
   +>      - чтение/запись
   >>      - дозапись в конец файла
   +>>     - чтение/дозапись
   
 Для указания прав надо писать эти значки перед именем файла. Например:
open(PASSWD, ">> /etc/passwd");
 Также существует способ открытия файлов позволяющий задать более гипкие права.
В часности указать что делать в случае отсутствия файла. Для этого надо
использовать функцию:

 sysopen(FH,$name, $flags, $param);
 
 FH     - файловый дескриптор.
 $name  - имя файла ( без > и др.)
 $flags - права доступа. Они могут иметь следущие значения:

            O_RDONLY  - Только для чтения
            O_WRONLY  - Только для записи
            O_RDWR    - Для чтения и для записи
            O_CREAT   - Если файла нет, создать!
            O_APPEND  - Открытие в режиме дозаписи
            O_TRUNC   - Очищаем содержимое при открытии

          Их можно комбинировать с помощью значков |. Например:
          sysopen(PASSWD, "/etc/passwd", O_WRONLY|O_TRUNC|O_CREATE) - откроет
          файл /etc/passwd только для записи, при этом усечет его содержимое
          до нулевой длинны если он существует, а если не существует то создаст.
 $param - Необязательный параметр который задает маску доступа к файлу для
          Unix систем. Если он не указан берется 0666.

 Также существует возможность заблокировать открытый файл. Это нужно для того
чтобы исключить возможность того что другая программа изменит ваш файл пока
вы с ним работаете. Для блокировки используйте функцию flock(); Ей необходимо
передать два параметра. Файловый дескриптор и тип блокировки. Типы блокировки
бывают следущие:

  1 - совместная (для чтения)
  2 - монопольная (для записи)
  4 - ассинхронный сброс блокировки
  8 - снятие блокировки
  
Пример использования: flock(PASSWD, 2);
 Для закрытия файла используется функция close(); Например close(PASSWD);
 
 Чтение/запись
 
 Для того чтобы прочитать строку из открытого файло нужно воспользоваться
такой конструкцией: $str=<PASSWD> Если вместо переменной $str использовать
массив @file=<PASSWD>, то в итоге мы получим в массиве @file - все строки
файла. К томуже мы в полне можем использовать для чтения файла такой цикл:

   while(<PASSWD>){
    # делаем что-то со строкой
   }

Внутри такого цикла, каждая следущая строка будет находиться внутри переменной
'$_'. Номер строки храниться в переменной '$.'.

 Для перемещения по файлу можно воспользоваться функциями tell() и seek().
Первая возвращает текущую позицию указателя в файле: $pos=tell(PASSWD);
А вторая устанавливает указатель на указаную позицию. Причем позицию можно
указать как положительную так и отрицатильную. В качестве третьего необязатель-
ного параметра эта функция принемает указатель отсчета. Он может быть равен
0 - от начала файла, 1 - от текущего положения и 2 - от конца файла.
Пример:

 $pos=tell(PASSWD);
 seek(PASSWD, $pos+10, 1);
 
 Для записи в файл используйте функцию print с указанием потока. Например:
 
  print PASSWD "cobalt:*:10:10:/bin/bash\n";

 Файловая система
 Для того чтобы удалить существующий файл надо воспользоваться функцией unlink()
Эта функция может принемать список имен файлов для удаления. Например:

 unlink("/etc/test","/etc/test1");
 
 Переименование файла осуществляется командой rename($old, $new);

 С каталогами дело обстоит по другому. Для создания каталога например надо
заюзать функцию mkdir(). Она принемает два параетра. Первый - имя каталога,
второй - права доступа для unix систем. Для удаления каталога используйте
rmdir($dirname). Только необходимо помнить что rmdir удаляет только пустые
каталоги.

 Т.к. Perl изначально разрабатывался для Unix систем, то логично что в нем
существуют функции для изменения прав на файл и смены владельца.
chmod(0666,"/etc/passwd") - делает файл /etc/passwd доступным на чтение для всех
chown(1234, 35, "/etc/passwd"); Теперь владелец файла /etc/passwd тот у кого
UID (идентификатор пользователя) = 1234 и GID (идентификатор группы) = 35.

 Мы можем изменить и метку времени файла воспользовавшись функцией utime и
передав ей в качестве параметров время создания, время изменения и имя файла:

 $time=700000000;
 utime($time,$time,"/etc.passwd");

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

 Cпособ 1 - функции -X (его очень удобно использовать для проверок в конструк-
циях if(){}):
    -e $filename провераяет существование файла
    -z $filename проверяет пустой ли файл
    -r $filename проверка прав на чтение файла
    -w $filename проверка прав на изменение
    -x $filename проверка прав на выполнение файла
    -o $filename Я владелец файла ?
    -f $filename это обычный файл?
    -d $filename это каталог?
    -l $filename это символическая ссылка?
    -p $filename это FIFO?
    -S $filename это сокет?
    -b $filename это блок-ориентированное спец. устройство?
    -c $filename это символьное спец. устройство?
    -t $filename Файловый манипулятор открыт для терминала?
    -u $filename У файла установлен бит setuid?
    -g $filename У файла установлен бит setgid?
    -k $filename У файла установлен бит запрета (бит-липучка)?
    -T $filename Это текстовый файл?
    -B $filename Это двоичный файл?
    int(-s $filename) вернет размет файла
    int(-M $filename) вернет кол-во дней со дня изменения
    int(-A $filename) вернет кол-во дней со дня чтения
    int(-C $filename) вернет кол-во дней со дня изменения дескриптора

Способ 2 - функция stat

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
 $atime, $mtime, $ctime, $blksize, $blocks) = stat($filename);

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
 $atime, $mtime, $ctime, $blksize, $blocks) = stat(FILEHANDLE);

stat возвращает список из 13-ти элементов. Вот их значение:

    0 $dev      номер устройства, на котором расположен файл
    1 $ino      номер файлового дескриптора
    2 $mode     флаги файла (права, setuid и прочее)
    3 $nlink    количество (жестких) ссылок на файл
    4 $uid      числовой идентификатор пользователя владельца файла
    5 $gid      числовой идентификатор группы владельца файла
    6 $rdev     идентификатор устройства (только спец. файлов)
    7 $size     размер файла в байтах
    8 $atime    время последнего чтения файла в секундах с 1.1.1970
    9 $mtime    время последнего изменения файла в секундах с 1.1.1970
   10 $ctime    время последнего изменения файлового дескриптора в секундах с
                1.1.1970
   11 $blksize  предпочтительный размер блока в файловой системе
   12 $blocks   количество блоков, зарезервированых на данный момент

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

 opendir(ETC, "/etc");
 @dir=readdir(ETC);
 closedir(ETC);
 
Теперь в массиве dir список фалов каталога /etc.

 В перл есть возможность создавать и ссылки. Для создания жесткой ссылкой надо
воспользоваться функцией link($file,$link); а для создания символической -
symlink($file,$link);

 Заключение
 Ну вот. Я перечислил все основные функции применяемые в Perl для работы с
файлами. Надеюсь что для тебя этот мануал будет полезным.

P.S.:
      На этом я хочу завершить цикл статей по Perl. Если честно, даже не
      представляю какую тему тебе еще раскрыть в этом языке. Но если будут
      пожелания, я всегда с удавольствием напишу для тебя статью на выбранную
      тобой тему. Свои пожелания пишите пожалуйста сюда



© Cobalt 23.05.2006 статья не оптимизирована

e-Commerce Partners Network
poeseashy написал:

Приветики! Читаю не первый день странички. Да вот скорость соединения хромает. Как можно подписаться на вашу RSS-ленту? Хотел бы читать вас и дальше.

Cobalt написал:

Вот наша Rss лента

RedOdept написал:

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

Ник:

Текст:
P Br B I Qute



Код: обновить
Последние комментарии
21.11.2017 21:49:37 Fedorrah написал:
reetly fredytor neusty ...
Пишем guestbook
21.11.2017 20:45:32 ThomasCet написал:
ThomasCetThomasCet
Пишем guestbook
21.11.2017 19:32:50 Vitaliyjew написал:
Diarseamews Meedayjex DicAccego ...
Пишем guestbook
Реклама

Тут должна была быть ваша реклама, но мы потеряли глиняную табличку с ее текстом. SapeId: 665044

Rambler's Top100