Читайте также:
|
|
Класс FileStream и файловый ввод-вывод на побайтовой основе. Как известно, информация, обрабатываемая компьютером, хранится в файлах. Под файлом подразумевается именованная информация на внешнем носителе, например, на жестком диске. Логически файл можно рассматривать как конечное количество последовательных байтов, поэтому такие устройства как дисплей, клавиатура, принтер можно рассматривать как частные случаи файлов. Передача данных с внешнего устройства в оперативную память называется чтением или вводом, обратный процесс – записью или выводом.
Типы файлов для хранения той или иной информации могут быть различны. Как правило, разработчик сам сочиняет необходимую структуру файла, например, doc. Также существуют стандарты, описывающие, каким образом информация должна храниться в файле jpeg, html и т.д. Несмотря на большое разнообразие форматов, их можно разделить на два класса: двоичные (бинарные) и текстовые. Обычно текстовые файлы применяются для хранения текстовой информации: txt, html, ini. Двоичные файлы применяются для хранения нетекстовой информации: изображений (bmp, jpg), исполняемых файлов (dll, ехе) и др.
Доступ к файлам может быть последовательным, когда очередной элемент можно прочитать (записать) только после аналогичной операции с предыдущим элементом, и произвольным, или прямым, при котором выполняется чтение (запись) произвольного элемента по заданному адресу.
Рассмотрим простейшие способы работы с файловыми потоками. Использование классов файловых потоков в программе предполагает следующие операции: 1. Создание потока и связывание его с физическим файлом. 2. Обмен (ввод-вывод). 3. Закрытие файла.
Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream. Каждый класс файловых потоков содержит несколько вариантов конструкторов, с помощью которых можно создавать объекты этих классов различными способами и в различных режимах. Например, файлы можно открывать только для чтения, только для записи или для чтения и записи.
На уровне операционной системы файлы имеют байтовую организацию. Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream, который является наследником абстрактного класса Stream, определяющего набор стандартных операций с потоками.
Чтобы создать байтовый поток, связанный с файлом, создается объект класса FileStream. При этом в классе определено несколько конструкторов. Чаще всего используется конструктор, который открывает поток для чтения и/или записи: FileStream(string filename, FileMode mode), где: 1. параметр filename определяет имя файла, с которым будет связан поток ввода-вывода данных; при этом filename определяет либо полный путь к файлу, либо имя файла, который находится в папке bin/debug вашего проекта. 2. параметр mode определяет режим открытия файла, который может принимать одно из возможных значений, определенных перечислением FileMode: FileMode.Append — добавления данных в конец файла; FileMode.Create — создание нового файла, при этом если существует файл с таким же именем, то он будет предварительно удален; FileMode.CreateNew — создание нового файла, при этом файл с таким же именем не должен существовать; FileMode.Open — открытие существующего файла; FileMode.OpenOrCreate — если файл существует, то открывает его, в противном случае создает новый; FileMode.Truncate — открывает существующий файл, но усекает его длину до нуля;
Если попытка открыть файл оказалась неуспешной, то генерируется одно из исключений: FileNotFoundException — файл невозможно открыть по причине его отсутствия; IOException — файл невозможно открыть из-за ошибки ввода-вывода; ArgumentNullException — имя файла представляет собой null-значение; ArgumentException — некорректен параметр mode; SecurityException — пользователь не обладает правами доступа; DirectoryNotFoundException — некорректно задан каталог.
Другая версия конструктора позволяет ограничить доступ только чтением или только записью: FileStream(string filename, FileMode mode, FileAccess how),
где: 1. параметры filename и mode имеют то же назначение, что и в
предыдущей версии конструктора; 2. параметр how, определяет способ доступа к файлу и может принимать одно из значений, определенных перечислением FileAccess: а) FileAccess.Read — только чтение; б) FileAccess.Write — только запись; в) FileAccess.ReadWrite — и чтение, и запись.
После установления связи байтового потока с физическим файлом внутренний указатель потока устанавливается на начальный байт файла.
Для чтения очередного байта из потока, связанного с физическим файлом, используется метод ReadByte(). После прочтения очередного байта внутренний указатель перемещается на следующий байт файла. Если достигнут конец файла, то метод ReadByte() возвращает значение -1.
Для побайтовой записи данных в поток используется метод WriteByte().
По завершении работы с файлом его необходимо закрыть. Для этого достаточно вызвать метод Close(). При закрытии файла освобождаются системные ресурсы, ранее выделенные для этого файла, что дает возможность использовать их для работы с другими файлами.
При выводе в файл выводимые данные зачастую записываются на конкретном физическом устройстве не сразу. Вместо этого они буферизуются на уровне операционной системы до тех пор, пока не накопится достаточный объем данных, чтобы записать их сразу одним блоком. Благодаря этому повышается эффективность системы. Так, на диске файлы организованы по секторам величиной от 128 байтов и более. Поэтому выводимые данные обычно буферизуются до тех пор, пока не появится возможность записать на диск сразу весь сектор.
Но если данные требуется записать на физическое устройство без предварительного накопления в буфере, то для этой цели можно вызвать метод Flush: void Flush().При неудачном исходе данной операции генерируется исключение IOException. Если же поток закрыт, то генерируется исключение ObjectDisposedException.
Дата добавления: 2015-09-10; просмотров: 98 | Поможем написать вашу работу | Нарушение авторских прав |