ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Шрифт:
Исходный код. Проект StringWriterReaderApp
Работа с BinaryWriter и BinaryReader
И последним из рассмотренных здесь средств чтения/записи будут BinaryReader и BinaryWriter, которые получаются непосредственно из System.Object. Эти типы позволяют читать и записывать дискретные типы данных в соответствующий поток в компактном двоичном формате. Класс BinaryWriter определяет чрезвычайно перегруженный метод Write, позволяющий поместить тип данных в соответствующий поток. Вдобавок к Write, класс BinaryWriter предлагает дополнительные члены, позволяющие получить или установить тип, производный от Stream, и обеспечить поддержку прямого доступа к данным (табл. 16.9).
Таблица 16.9. Основные члены BinaryWriter
Член | Описание |
---|---|
BaseStream | Свойство, доступное только для чтения. Обеспечивает доступ к потоку, используемому с объемом BinaryWriter |
Close | Метод, завершающий двоичный поток |
Flush | Метод, выполняющий очистку двоичного потока |
Seek | Метод, устанавливающий указатель позиции в текущем потоке |
Write | Метод, записывающий значение в текущий поток |
Класс BinaryReader дополняет функциональные возможности, предлагаемые членами BinaryWriter (табл. 16.10).
Таблица 16.10. Основные Члены BinaryReader
Член | Описание |
---|---|
BaseStream | Свойство, доступное только для чтения. Обеспечивает доступ к потоку, используемому с объектом BinaryReader |
Close | Метод, завершающий двоичный поток чтения |
PeekChar | Метод, возвращающий следующий доступный символ без фактического смещения указателя позиции в потоке |
Read | Метод, считывающий заданное множество байтов или символов и запоминающий их во входном массиве |
ReadXXX | Класс BinaryReader определяет множество методов ReadXXX, "захватывающих" следующий тип из потока (ReadBoolean, ReadByte, ReadInt32 и т.д.) |
В следующем примере в новый файл *.dat записывается целый ряд типов данных,
Обратите внимание на то, что объект FileStream, возвращенный из FileInfo.OpenWrite, передается конструктору типа BinaryWriter. С помощью такого подхода очень просто выполнить "расслоение" потока перед записью данных. Следует осознавать, что конструктор BinaryWriter способен принять любой тип, производный от Stream (например, FileStream, MemoryStream или BufferedStream). Поэтому, если нужно записать двоичные данные, например, в память, просто укажите подходящий объект MemoryStream.
Для чтения данных из файла BinFile.dat тип BinaryReader предлагает множество опций. Ниже мы используем PeekChar, чтобы выяснить, имеет ли поток еще данные, и в том случае, когда он их имеет, использовать ReadByte для получения значения. Обратите внимание на то, что байты форматируются в шестнадцатиричном виде и между ними вставляются семь пробелов.
Исходный код. Проект BinaryWriterReader размещен в подкаталоге, соответствующем главе 16.
Вывод этой программы показан на рис. 16.9.
Рис. 16.9. Чтение байтов из двоичного файла
Программный мониторинг файлов
Теперь, когда вы уже знаете возможности различных средств чтения и записи давайте, рассмотрим роль класса FileSystemWatcher. Этот тип может быть исключительно полезен тогда, когда требуется программный мониторинг файлов, имеющихся в данной системе. В частности, с помощью типа FileSystemWatcher можно контролировать любые из действий, указанных в перечне NotifyFilters (значения его членов очевидны, но в случае необходимости более точную информацию можно получить с помощью справочной системы).
Первым делом для работы с типом FileSystemWatcher нужно установить свойство Path, с помощью которого можно указать имя (и место размещения) каталога, содержащего контролируемые файлы, и свойство Filter, с помощью которого определяются расширения контролируемых файлов.