Шаг 31.
Доступ к файлу. Функция sysopen()

    На этом шаге мы рассмотрим функцию sysopen().

    Открытие файла и создание для него дескриптора функцией open() охватывает все практически важные режимы работы с файлом. Однако возможности этой функции не позволяют задать права доступа для создаваемых файлов, а также вообще решить, следует ли создавать файл, если его не существует. Для подобного "тонкого" открытия файлов можно использовать функцию sysopen(), которая позволяет программисту самому задать отдельные компоненты режима работы с файлом: чтение, запись, создание, добавление, очистка содержимого и т. д. Синтаксис этой функции таков:

    sysopen ДЕСКРИПТОР, ИМЯ_ФАЙЛА, ФЛАГ [, РАЗРЕШЕНИЕ];

    Здесь параметр ИМЯ_ФАЙЛА представляет имя файла без префиксов функции open(), определяющих режим открытия файла. Последний задается третьим параметром ФЛАГ - числом, представляющим результат операции побитового ИЛИ (|) над константами режимов, определенными в модуле Fcntl. Состав доступных констант зависит от операционной системы. В таблице 1 перечислены константы режима, встречающиеся практически во всех операционных системах.

Таблица 1. Константы режима доступа к файлу
Константа Значение
O_RDONLY Только чтение
O_WRONLY Только запись
O_RDWR Чтение и запись
O_CREAT Создание файла, если он не существует
O_EXCL Завершение с ошибкой, если файл уже существует
O_APPEND Добавление в конец файла
O_TRUNC Очистка содержимого файла

    Права доступа (необязательный параметр РАЗРЕШЕНИЕ) задаются в восьмеричной системе и при их определении учитывается текущее значение маски доступа к процессу, задаваемого функцией umask(). Если этот параметр не задан, то Perl использует значение 0666.


    Замечание. Если возникают затруднения с установкой прав доступа, то придерживайтесь следующего правила: для обычных файлов передавайте 0666, а для каталогов и исполняемых файлов 0777.

    В следующем примере собраны операции открытия файлов функцией open() и эквивалентные им открытия с помощью функции sysopen().

use  Fcntl;
# Только чтение.
open FF, "< file.txt";
sysopen FF, "file.txt", O_RDONLY;
# Только запись (создается, если не существует,
# и очищается содержимое, если существует)
open FF, "> file.txt";
sysopen FF, "file.txt", O_WRONLY | O_CREAT | O_TRUNC;
# Добавление в конец (создается, если не существует).
open FF,   ">> file.txt";
sysopen FF, "file.txt", O_WRONLY | O_CREAT | O_APPEND;
# Чтение/запись (файл должен существовать).
open FF, "+< file.txt";
sysopen FF, "file.txt", O_RDWR;
# Чтение/запись (файл очищается).
open FF, "+> file.txt";
sysopen FF, "file.txt", O_RDWR | O_CREAT | O_TRUNC;

    При открытии файла функции open() и sysopen() возвращают значение 0, если открытие файла с заданным режимом произошло успешно, и неопределенное значение undef в противном случае. Всегда следует проверять успешность выполнения операции открытия файла, прекращая выполнение программы функцией die(). Эта функция отображает список передаваемых ей параметров и завершает выполнение сценария Perl:

    open(FF, "+< $file") or die "Нельзя открыть файл $file: $!";

    Обратите внимание, в сообщении функции die() используется специальная переменная $!, в которой хранится системное сообщение или код ошибки. Эта информация помогает обнаружить и исправить ошибки в программе. Например, если переменная $file содержит имя несуществующего файла, то при выполнении предыдущего оператора пользователь может увидеть сообщение следующего вида:

 Нельзя открыть файл file.txt: No such file or directory at D:\PERL\EX2.PL line 4.

    Английский текст этого сообщения представляет информацию, содержащуюся в переменной $!.

    Для полноты описания работы с функцией open() следует сказать, что если имя файла представляет строку "-", то открываемый файл соответствует стандартному вводу STDIN. Это означает, что ввод с помощью созданного дескриптора файла осуществляется со стандартного устройства ввода. Если имя файла задано в виде строки ">-", то это соответствует выводу на стандартное устройство вывода, представленное в программе дескриптором STDOUT.


    Замечание. Если стандартный ввод или вывод были перенаправлены, то ввод/вывод с помощью дескрипторов, соответствующих файлам "-" и ">-", будет осуществляться в файл, определенный в операции перенаправления стандартного ввода или вывода.

    На следующем шаге мы рассмотрим создание дескриптора-дубликата.




Предыдущий шаг Содержание Следующий шаг