Создание приложений, работающих с потоковыми файлами
Основные понятия
Данные в приложениях VB можно не только вводить с клавиатуры и отображать на экране, но и читать из файла, где они хранятся, и записывать в файл.
Файл - это поименованная совокупность любых данных, размещенная на внешнем запоминающем устройстве, хранимая, пересылаемая и обрабатываемая как единое целое. Файл может содержать программу, числовые данные, текст, закодированное изображение и пр. Физически файлы реализуются как участки памяти на внешних носителях, например, на магнитных дисках или CD-ROM. Каждый файл должен иметь имя.
К файловой системе имеет доступ любая прикладная программа, для этого во всех языках программирования, в том числе и в VB, имеются специальные средства в виде методы классов .NET Framework для работы с файлами.
По способу доступа к данным различают файлы последовательного доступа, произвольного доступа и двоичные. В файлах первого вида доступ к информации осуществляется последовательно от начала до конца файла, в файлах произвольного доступа - либо последовательно, либо в произвольном порядке, а в двоичных файлах - побайтно.
Текстовые файлы состоят из одной или более строк, слов или символов. Обычные текстовые файлы определены в MS Windows как Текстовые документы и имеют расширение *.txt.
Работа с любым файлом, в том числе с текстовыми файлами, состоит из трех этапов:
- • открытие файлов;
- • чтение или запись информации из файла или в файл;
- • закрытие файла.
Поток - это программный виртуальный канал для обмена данными между приложением и Windows или другим приложением. При взаимодействии приложения с Windows потоки, как правило, используются для работы с устройствами и представляют собой абстрактный уровень между приложением и устройством, что позволяет скрыть от приложения низкоуровневый механизм доступа к устройствам, упростить и унифицировать процесс написания программ, использующих ввод/вывод. Поток представляется программисту как логическое устройство приема-передачи информации. Потоки бывают входные и выходные. Данные, поступающие в поток, как правило, буферизуются, т. е. помещаются в специальный буфер данных, в котором они могут храниться. Передача данных из буфера получателю данных происходит при запросе от получателя или в случае заполнения буфера данных. Если получатель производит чтение данных, когда буфер потока пуст, то данная ситуация расценивается как достижение конца потока.
Поток для работы может быть отрыт в текстовом или бинарном режиме. С потоками можно производить следующие действия: открывать и закрывать потоки; посылать данные в поток и получать данные из потока; анализировать ошибки потокового ввода-вывода; управлять буферизацией потока и размером буфера; позиционировать указатель чтения-записи данных в потоке (если возможно). Все потоки и методы для работы с ними связаны с понятием «файл».
Отличие потока от файла заключается в том, что поток представляет собой абстрактный уровень доступа программиста к физическому устройству, а файл представляет собой способ хранения информации на этом физическом устройстве. Операция открытия файла связывает поток с определенным файлом, операция закрытия разрывает эту связь. Каждый поток, связанный с файлом, имеет управляющую структуру типа FILE. Указатель на данную структуру, называемый также файловой переменной, является связующим звеном между потоком и файлом, работа с потоком, а значит, и со связанным с ним файлом, осуществляется через связанный с потоком указатель на файловую переменную.
Грубо обобщая, можно разделить функции ввода/вывода в каркасе .NET Framework на две широкие категории, не зависящие от устройства хранения данных, - это запись и чтение.
Данные могут рассматриваться как поток байтов или символов. Данные также можно рассматривать как набор объектов.
Stream (Поток, Абстрактный файл) - абстрактный класс, который является базовым для чтения и записи байтов в некоторое хранилище данных типа файла. Этот класс поддерживает синхронные и асинхронные чтение и запись. Асинхронные методы обсуждаются ниже в данной главе.
Класс FileStream, который является производным от класса Stream, предоставляет операции чтения и записи последовательности байтов в файл. Конструктор FileStream создает экземпляр потока. Перегруженные методы класса Stream (Поток, Абстрактный последовательный файл) осуществляют чтение и запись в файл.
Для загрузки в текстовое поле или строку содержимого текстового файла, а также для записи строковых данных в файл в VB можно использовать потоковый доступ:
- • с использованием методов класса System. 10 библиотеки Framework. NET;
- • с использованием объекта Му. Computer. System.
При работе с файлами во время выполнения программы могут возникать различные непредвиденные ошибочные ситуации.
Рассмотрим средства VB для обработки ошибок времени выполнения.
Ошибки времени выполнения (также называемые исключениями) возникают при исключительных условиях работы - например, из-за отсутствия диска в дисководе или неправильного заданного пути при открытии файла. Блоки кода, обрабатывающие такие ошибки, называются структурными обработчиками ошибок (или структурными обработчиками исключений). Их можно использовать для распознавания ошибок времени исполнения при их возникновении в программе и настройки программы так, что она снова сможет получить управление и продолжить работу. Для этого имеется блок Try...Catch...End Try - синтаксическая конструкция VB для обработки ошибок.
Ошибка времени исполнения возникает тогда, когда VB пытается выполнить оператор, который по какой-то причине не может быть выполнен в том виде, в котором он написан. Это не значит, что VB недостаточно «умен», чтобы справиться с проблемой; это значит, что компилятору VB не сказали, что делать, если что-то пойдет не так.
Можно написать специальные процедуры VB, называемые структурными обработчиками ошибок, которые будут реагировать на ошибки времени исполнения. Обработчик ошибок отслеживает ошибку времени исполнения и говорит программе, как продолжать работу при возникновении этой ошибки. Обработчики ошибок помещаются в процедуры событий там, где существует возможность возникновения проблемы, или в общие функции или подпрограммы, специально предназначенные для обработки ошибок. Как предполагает их название, обработчики ошибок обрабатывают ошибку с помощью оператора Тry...Catch...End Try и специального объекта отслеживания ошибок - экземпляра класса Exception. Например, если ошибка времени исполнения произошла при загрузке файла с диска, обработчик ошибок может отобразить собственное сообщение об ошибке, которое укажет на проблему.
Оператор Try необходимо поместить в процедуру события непосредственно перед оператором, в котором может произойти непредвиденная ситуация, а блок Catch следует непосредственно за ним и содержит операторы, которые необходимо выполнить, если произойдет ошибка времени исполнения. Также можно использовать некоторые дополнительные операторы, такие как Finally, а также вложенные блоки кода Тry...Catch...End Тгу. Базовый синтаксис обработчика исключений Try...Catch...End Try может иметь следующий формат:
Try
Операторы, которые могут вызвать ошибку времени исполнения Catch
Операторы, которые выполняются,
если ошибка времени исполнения происходит Finally
Дополнительные операторы,
выполняемые независимо от возникновения ошибки End Try
где Т г у, Catch и End Try - это обязательные ключевые слова, aFinally и операторы, которые стоят за ним, не обязательны.
В Примерах 10.2-1 и 10.2-2 продемонстрирована ситуация возникновения ошибки времени выполнения, связанная с открытием файла.