10.1.1. Класс FileStream
Объект класса FileStream представляет поток, указывающий на дисковый файл или сетевой путь. В то время как класс предоставляет методы для чтения и записи байт в файл, чаще всего для выполнения этих функций используются классы StreamReader или StreamWriter. Класс FileStream оперирует байтами и байтовыми массивами, а классы Stream — символьными данными. Работать с символьными данными проще, но некоторые операции, например, произвольный доступ к файлу (доступ к данным в некоторой точке посреди файла), могут выполняться только посредством объекта FileStream.
Есть несколько способов создания объекта FileStream. Конструктор имеет много различных перегрузок, но простейшая из них принимает два аргумента: имя файла и значение перечисления FileMode:
FileStream aFile =
new FileStream(filename, FileMode.Member);
Перечисление FileMode состоит из нескольких членов, которые специфицируют способ открытия или создания файла. Другой часто используемый конструктор выглядит так:
FileStream aFile =
new FileStream (filename, FileMode.Member,
FileAccess.Member);
Третий параметр — член перечисления FileAccess — задает способ специфицирования назначения потока. Члены перечисления FileAccess приведены в табл. 10.3.
Таблица 10.3.
Члены перечисления FileAccess
Член |
Описание |
Read |
Открывает файл только для чтения |
Write |
Открывает файл только для записи |
ReadWrite |
Открывает файл только для чтения или записи |
Попытка выполнить действие, отличное от специфицированного членом перечисления FileAccess, приведет к генерации исключения. Это свойство часто используется в качестве способа варьировать доступ пользователя к файлу на основе его уровня авторизации.
В версии конструктора FileStream, не использующего параметр-перечисление FileAccess, применяется значение по умолчанию, которым является FileAccess.ReadWrite.
Члены перечисления FileMode показаны в табл. 10.4. Что в действительности происходит, когда каждое из этих значений используется, зависит от того, ссылается ли указанное имя файла на существующий файл. Элементы этой таблицы ссылаются на позицию в файле, на которую установлен поток при его создании. Если не установлено иначе, поток устанавливается в начало файла.
Таблица 10.4.
Члены перечисления FileMode
Член |
Поведение при существующем файле |
Поведение при отсутствии файла |
Append |
Файл открыт, поток установлен в конец файла. Может использоваться только в сочетании с FileAccess .Write |
Создается новый файл. Может использоваться только в сочетании с FileAccess.Write |
Create |
Файл уничтожается и на его месте создается новый |
Создается новый файл |
CreateNew |
Генерируется исключение |
Создается новый файл |
Open |
Файл открывается, поток позиционируется в начало файла |
Генерируется исключение |
OpenCreate |
файл открывается, поток позиционируется в начало файла |
Создается новый файл |
Truncate |
файл открывается и очищается. Поток позиционируется в начало файла. Исходная дата создания файла остается неизменной |
Генерируется исключение |
Оба класса — и File, и FileInfo — предоставляют методы OpenRead() и OpenWrite(), облегчающие создание объектов FileStream. Первый открывает файл с доступом только для чтения, а второй позволяет доступ только для записи. Эти методы являются сокращениями, так что не нужно предоставлять всю необходимую информацию в форме параметров конструктора FileStream. Например, следующая строка кода открывает файл Data.txt с доступом только для чтения:
FileStream aFile = File.OpenRead("Data.txt");
Следующий код выполняет ту же функцию:
FileInfo aFileInfo = new FileInfo("Data.txt");
FileStream aFile = aFileInfo.OpenRead();
