Шохирев Михаил Васильевич
Шрифт:
При работе с данными фиксированной длины обычной практикой является считывание или запись данных в произвольном месте файла, например, при изменении только что считанного блока данных. Для этого нужно позиционировать позицию чтения или записи. Это делается с помощью функции seek, которой передается три аргумента: файловый манипулятор, смещение в байтах и указатель позиции отсчета. Позиция отсчета задается числами: 0 - от начала файла, 1 - от текущей позиции, 2 - от конца файла. Например:
С помощью функции tell, которая возвращает смещение относительно начала файла, можно узнать текущую позицию чтения-записи и использовать ее для дальнейших перемещений по файлу.
В следующем примере увеличивается поле счетчика длиной 2 байта, расположенное в файле с позиции $new_pos:
Операции ввода-вывода с произвольным доступом часто используются для работы с базами данных, основанных на записях фиксированной длины, например, с файлами в формате DBF. Они позволяют организовать быструю выборку данных и запись измененных данных на прежнее место.
Перед выполнением операций ввода-вывода часто требуется узнать информацию об объектах файловой системы. В Perl есть набор унарных операций для удобной проверки различных характеристик файлов и каталогов. Они имеют вид флагов из одной латинской буквы с предшествующим знаком минус, после которого указывается имя проверяемого файла. Полный перечень операций проверки файлов приведен в таблице 9.3.
Таблица 9.3. Операции проверки файлов
| Операции | Описание проверок |
|---|---|
| – r -w -x | Файл доступен для чтения / записи / исполнения (по effective UID+GID) |
| – R -W -X | Файл доступен для чтения / записи / исполнения (по real UID+GID) |
| – o -O | Файл принадлежит текущему пользователю по effective / real UID |
| – e -z | Файл существует (exists) / имеет нулевую длину (zero) |
| – s | Файл имеет ненулевой размер: возвращает размер в байтах (size) |
| – f -d | Файл является обычным файлом (file) / каталогом (directory) |
| – l -S -p | Файл является ссылкой / сокетом / именованным FIFO-каналом (pipe) |
| – b -c | Файл является блочным / символьным специальным файлом |
| – u -g -k | Для файла установлен бит setuid / setgid / sticky |
| – t | Файловый манипулятор связан с терминалом (tty) |
| – T -B | Файл является текстовым (text) / двоичным (binary) |
| – M -A -C | Время изменения (modification) / доступа (access) / изменения (change) индексного узла (inode) файла в днях относительно времени начала выполнения программы ($^T) |
Вот несколько типичных примеров использования операций проверки файлов для контроля доступности данных:
В Perl есть целый набор встроенных функций для работы с файлами, с помощью которых можно манипулировать с самими файлами, а не с данными, хранящимися в них.
Функция rename переименовывает файл, возвращая логическое значение: 1 при успешном изменении имени и 0 - в противном случае. Ей передаются старое и новое имя файла с абсолютным или относительным путем.
Функция unlink удаляет файл или список файлов, возвращая число 1 при успешном удалении и 0 - при ошибке.
Функция truncate усекает файл до указанного размера и возвращает число 1 в случае успешного выполнения усечения и неопределенное значение undef– при возникновении ошибки. Файл может задаваться именем или файловым манипулятором. Например: