Поиск

Свободные дескрипторы, тестирование файлов и двоичные данные

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

Свободные дескрипторы

Perl начал свою жизнь в качестве утилиты для UNIX. Поэтому иногда это происхождение проявляется и на других, отличных от UNIX, платформах. Перед запуском программы на Perl для нее автоматически создаются три дескриптора файлов: STDOUT (стандартный выходной поток), STDIN (стандартный входной поток) и STDERR (стандартный поток ошибок). По умолчанию все они связаны с терминалом. .

Для считывания введенного вами с клавиатуры текста в Perl используется дескриптор STDIN:

Для вывода данных на экран терминала предусмотрена функция print, которая по умолчанию использует дескриптор файла STDOUT, например:

На 12-м занятии, "Работа с командной строкой Perl", вы узнаете, как изменить имя дескриптора файла, который по умолчанию используется в функции print.

Дескриптор STDERR обычно также связан с терминалом. Он используется для отображения сообщений об ошибках. В UNIX сообщения об ошибках и обычных данные могут быть выведены на различные мониторы. Поэтому традиционный подход заключается в том, чтобы выводить сообщения об ошибках в стандартный поток ошибок STDERR. Например, функции die и warn выводят свои сообщения в STDERR. Если операционная система не поддерживает отдельного потока ошибок, как, например, в случае DOS или Windows, поток STDERR выводится в STDOUT.

Вопрос о перенаправлении вывода и сообщений об ошибках в UNIX выходит за рамки этой книги. В различных оболочках это делается по-своему. Данная тема подробно рассматривается в любой более - менее приличной книге по UNIX.
Работа с бинарными файлами

Некоторые операционные системы, такие как VMS, Atari ST и в особенности Windows и DOS, различают двоичные (бинарные) и текстовые файлы. Это вызывает определенные проблемы, так как Perl не видит между ними отличий. Текстовые файлы состоят из записей, оканчивающихся символами конца строки, называемыми разделителями записей. Двоичные файлы — это набор битов, которые должны быть правильно интерпретированы, например изображения, программы и файлы данных.

Когда выполняется запись данных в текстовый файл, Perl рассматривает символ \п как разделитель записей, принятый в данной операционной системе. В UNIX \n преобразуется в ASCII-код 10 (символ LF), в Macintosh и Windows — в ASCII-коды 13 и 10 (CRLF). Это особенность текстовых файлов.

При записи двоичных данных, таких как файлы GIF, EXE, документы MS Word и т.п., преобразование данных не требуется. Поэтому, чтобы ни Perl, ни операционная система не делали подобных преобразований, перед записью двоичных данных в файл необходимо использовать функцию binmode. Она помечает дескриптор файла как двоичный. Функция binmode вызывается после открытия файла, но до того, как будет выполнен ввод или вывод данных. Вот пример:

После открытия файла функцию binmode к его дескриптору можно применить только один раз. При закрытии и повторном открытии двоичного файла придется заново вызвать функцию binmode. Использование biimode в системах, где не различаются текстовые и двоичные файлы (например, в UNIX), не вызывает никаких действий.

Операторы тестирования файлов

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

Здесь X— конкретная операция тестирования, а дескриптор_файла тестируемый дескриптор. Файл можно протестировать и без открытия дескриптора. В табл. 5.2 приведенынекоторые операторы тестирования.

Полный список операторов тестирования файлов можно найти в документации. Наберите в командной строке perldoc perlfunc и найдите раздел Alphabetical List of Perl Functions.

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