Чтение и запись двоичных файлов
Для более общего способа чтения и записи файлов используются классы BinaryReader и BinaryWriter, предназначенные для чтения двоичных данных. Любой файл в конечном итоге представляет собой набор двоичных данных, следовательно, эти данные можно считывать и записывать во внутреннем, двоичном формате. Класс BinaryWriter представляет собой оболочку для байтового потока, управляющей записью двоичных данных. Класс BinaryReader является оболочкой, содержащей байтовый поток, и выполняет чтение двоичных данных.
Рассмотрим приложение, позволяющее считывать файл формата MP3 и записывать фрагмент этого файла. Создайте новое консольное приложение и назовите его BinaryReadWrite. В папку bin/Debug поместите любой музыкальный файл формата MP3, имеющийся на вашем компьютере.
Подключаем пространство имен:
using System.IO;
Добавляем код:
Листинг 2.17.
(html, txt)
Запускаем приложение. Если все сработает без ошибок — на экране появится станадртное сообщение Press any key to continue, в противном случае — поскольку мы включили блок исключений — выйдет диагностическое сообщение. Перейдем в папку bin/Debug. В ней появился файл newmusic.mp3, прослушать который мы можем с помощью любого музыкального проигрывателя.
Рассмотрим перечисления в конструкторах FileStream. Параметр FileMode определяет, каким образом открывается файл (рис. 2.36):

Рис. 2.36. Перечисления FileMode
Значения перечисления FileMode указаны в таблице 2.4.
Append | Если файл существует, он открывается, если нет — создается новый. Данные добавляются в конец файла |
Create | Создается новый выходной файл; если файл с таким названием существует, он перезаписывается |
CreateNew | Создается новый выходной файл; если файл с таким названием уже существует, генерируется исключение IOException |
Open | Открывается существующий файл; если файла с таким названием не существует, генерируется исключение FileNotFoundException |
OpenOrCreate | Открывается существующий файл; если файл не существует, он создается |
Truncate | Открывается существующий файл, но его длина усекается до нуля |
Параметр FileAccess определяет для пользователя разрешение на доступ к файлу (рис. 2.37):

увеличить изображение
Рис. 2.37. Перечисления FileAccess
Значения перечисления FileAccess указаны в таблице 2.5.
Read | Доступ на чтение из файла |
ReadWrite | Разрешается чтение из файла и запись данных в файл |
Write | Доступ для записи в файл |
Дополнительно для управления режимом доступа при одновременной работе с файлами нескольких потоков используется перечисление FileShare (рис. 2.38). Например, при создании потока для чтения файла мы могли полностью определить все параметры следующим образом:
FileStream Chtenie = new FileStream("music.mp3", FileMode.Open, FileAccess.Read, FileShare.Read);

увеличить изображение
Рис. 2.38. Перечисления FileShare
Значения перечисления FileShare указаны в таблице 2.6.
Inheritable | Дает доступ к файлам, образованных текущем потоком |
None | Запрещает совместное использование текущего файла. Пока файл открыт, доступ к нему будет блокирован |
Read | Позволяет открывать текущей файл для чтения |
ReadWrite | Позоволяет открывать текущий файл для чтения или записи |
Write | Позволяет открывать текущий файл для записи |
На диске, прилагаемом к книге, вы найдете приложение BinaryReadWrite (Code\Glava2\ BinaryReadWrite).

увеличить изображение
Рис. 2.38. Перечисления FileShare
Значения перечисления FileShare указаны в таблице 2.6.
Inheritable | Дает доступ к файлам, образованных текущем потоком |
None | Запрещает совместное использование текущего файла. Пока файл открыт, доступ к нему будет блокирован |
Read | Позволяет открывать текущей файл для чтения |
ReadWrite | Позоволяет открывать текущий файл для чтения или записи |
Write | Позволяет открывать текущий файл для записи |
На диске, прилагаемом к книге, вы найдете приложение BinaryReadWrite (Code\Glava2\ BinaryReadWrite).