На этом шаге мы рассмотрим функцию sysopen().
Открытие файла и создание для него дескриптора функцией open() охватывает все практически важные режимы работы с файлом. Однако возможности этой функции не позволяют задать права доступа для создаваемых файлов, а также вообще решить, следует ли создавать файл, если его не существует. Для подобного "тонкого" открытия файлов можно использовать функцию sysopen(), которая позволяет программисту самому задать отдельные компоненты режима работы с файлом: чтение, запись, создание, добавление, очистка содержимого и т. д. Синтаксис этой функции таков:
sysopen ДЕСКРИПТОР, ИМЯ_ФАЙЛА, ФЛАГ [, РАЗРЕШЕНИЕ];
Здесь параметр ИМЯ_ФАЙЛА представляет имя файла без префиксов функции open(), определяющих режим открытия файла. Последний задается третьим параметром ФЛАГ - числом, представляющим результат операции побитового ИЛИ (|) над константами режимов, определенными в модуле Fcntl. Состав доступных констант зависит от операционной системы. В таблице 1 перечислены константы режима, встречающиеся практически во всех операционных системах.
Константа | Значение |
---|---|
O_RDONLY | Только чтение |
O_WRONLY | Только запись |
O_RDWR | Чтение и запись |
O_CREAT | Создание файла, если он не существует |
O_EXCL | Завершение с ошибкой, если файл уже существует |
O_APPEND | Добавление в конец файла |
O_TRUNC | Очистка содержимого файла |
Права доступа (необязательный параметр РАЗРЕШЕНИЕ) задаются в восьмеричной системе и при их определении учитывается текущее значение маски доступа к процессу, задаваемого функцией umask(). Если этот параметр не задан, то Perl использует значение 0666.
В следующем примере собраны операции открытия файлов функцией 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.
На следующем шаге мы рассмотрим создание дескриптора-дубликата.