Программирование >>  Программирование с использованием ajax 

1 ... 243 244 245 [ 246 ] 247 248 249 ... 396


При необходимости можете определить рабочий каталог, используя Directory. GetCurrentDirectory О , или же установить его в новый путь с помощью Directory. SetCurrentDirectory().

Объект FileStream

Объект FileStream представляет поток, указывающий на дисковый файл или сетевой путь. В то время как класс предоставляет методы для чтения и записи байт в файл, чаще всего для выполнения этих функций вы будете использовать StreamReader или StreamWriter. Это потому, что класс FileStream оперирует байтами и байтовыми массивами, а классы Stream - символьными данными. Работать с символьными данными проще, но некоторые операции, например, произвольный доступ к файлу (доступ к данным в некоторой точке посреди файла), могут выполняться только посредством объекта FileStream. Далее в этой главе вы узнаете об этом подробнее.

Есть несколько способов создания объекта FileStream. Конструктор имеет множество различных перегрузок, но простейшая из них принимает два аргумента: имя файла и значение перечисления FileMode:

FileStream aFile = new FileStream (Г11елаязе, FileMode .МелъЬег) ;

Перечисление FileMode состоит из нескольких членов, которые специфицируют способ открытия или создания файла. Вскоре вы увидите эти способы. Другой часто используемый конструктор выглядит так:

FileStream aFile = new FileStream(Г11елаязе, FileMode.МелъЬег, FileAccess.МелъЬег) ;

Третий параметр - член перечисления FileAccess - задает способ специфицирования назначения потока. Члены перечисления FileAccess приведены в табл. 24.7.

Таблица 24.7. Члены перечисления FileAccess Член Описание

Read Открывает файл только для чтения

Write Открывает файл только для записи

ReadWrite Открывает файл только для чтения или записи

Попытка выполнить действие, отличное от специфицированного членом перечисления FileAccess, приведет к генерации исключения. Это свойство часто используется в качестве способа варьировать доступ пользователя к файлу на основе его уровня авторизации.

В версии конструктора FileStream, не использующего параметр-перечисление FileAccess, применяется значение по умолчанию, которым является FileAccess. ReadWrite.

Члены перечисления FileMode показаны в табл. 24.8. Что в действительности происходит, когда каждое из этих значений используется, зависит от того, ссылается ли указанное имя файла на существующий файл. Обратите внимание, что элементы этой таблицы ссылаются на позицию в файле, на которую установлен поток при его создании; эта тема будет подробнее раскрыта в следующем разделе. Если не установлено иначе, поток устанавливается в начало файла.



Таблица 24.8. Члены перечисления FileMode

Член

Поведение при существующем файле

Поведение при отсутствии файла

Append

Файл открыт, поток установлен в конец файла. Может использоваться только в сочетании с FileAccess .Wnte

Создается новый файл. Может использоваться только в сочетании с

FileAccess.Write

Create

Файл уничтожается и на его месте создается новый

Создается новый файл

CreateNew

Генерируется исключение

Создается новый файл

Open

Файл открывается, поток позиционируется в начало файла

Генерируется исключение

OpenCreate

Файл открывается, поток позиционируется в начало файла

Создается новый файл

Truncate

Файл открывается и очищается. Поток позиционируется в начало файла. Исходная дата создания файла остается неизменной

Генерируется исключение

Оба класса - и File, и Filelnfo - предоставляют методы OpenRead () и OpenWrite (), облегчающие создание объектов FileStream. Первый открывает файл с доступом только для чтения, а второй позволяет доступ только для записи. Эти методы являются сокращениями, так что вам не нужно предоставлять всю необходимую информацию в форме параметров конструктора FileStream. Например, следующая строка кода открывает файл Data. txt с доступом только для чтения:

FileStream aFile = File.OpenRead( Data.txt );

Следующий код выполняет ту же функцию:

Filelnfo aFilelnfo = new Fileinfо( Data.txt ); FileStream aFile = aFilelnfo.OpenRead ();

Позиция в файле

Класс FileStream поддерживает внутренний указатель файла, который указывает на местоположение внутри файла, где произойдет следующая операция чтения или записи. В большинстве случаев, когда файл открывается, этот указатель установлен на начало файла, но этот указатель можно модифицировать. Это позволит приложению читать или писать в любом месте внутри файла, что, в свою очередь, позволяет организовать произвольный доступ к файлу с возможностью перепрыгнуть непосредственно к определенному месту в файле. Это позволяет сэкономить массу времени при работе с очень большими файлами, поскольку вы можете мгновенно перемещаться в необходимое место.

Метод, реализующий эту функциональность - Seek () - принимает два параметра. Первый параметр указывает, насколько далеко в байтах нужно переместить указатель файла. Второй параметр специфицирует, откуда начинать подсчет, в форме значения из перечисления SeekOrigin. Перечисление SeekOrigin содержит три значения: Begin, Center и End.

Например, следующая строка переместит указатель файла к восьмому байту файла, начиная с самого первого в этом файле:

aFile.Seek(8, SeekOrigin.Begin);



Следующая строка переместит указатель файла на два байта вперед, начиная с текущей позиции. Если ее исполнить сразу после предыдущей строки, то указатель файла теперь будет указывать на десятый байт в файле:

aFile.Seek (2, SeekOrigm .Current) ;

Когда вы читаете или пишете в файл, файловый указатель также изменяется. После прочтения 10 байт файловый указатель будет установлен на байт, находящийся после десятого прочитанного байта.

Вы можете также специфицировать отрицательное значение смещения, которое может быть скомбинировано со значением перечисления SeekOrigin.End, чтобы работать недалеко от конца файла. Следующий оператор переносит указатель файла на пять байтов от конца файла:

aFile.Seek(-5, SeekOrigin.End);

Файлы с возможностью доступа в такой манере иногда называют файлами произвольного доступа, потому что приложение может обращаться к любой позиции внутри файла. Классы Stream, описанные далее, обращаются к файлам последовательно и не позволяют манипулировать указателями файла подобным образом.

Чтение данных

Чтение данных с использованием класса FileStream не так просто, как посредством класса StreamReader, с которым вы ознакомитесь в конце главы. Это связано с тем, что класс FileStream имеет дело исключительно с сырыми байтами. Работа с сырыми байтами делает класс FileStream полезным для любого рода файлов данных, а не только для текстовых. Читая байтовые данные, объект FileStream может применяться для чтения таких файлов, как файлы изображений или звуковые файлы. Ценой гибкости является то, что вы не можете использовать FileStream для чтения данных непосредственно в строку, как это делается с классом StreamReader. Однако несколько классов преобразования позволяют довольно легко конвертировать байтовые массивы в символьные массивы и наоборот.

Метод FileStream.Read О - главное средство доступа к данным из файла, на который указывает объект FileStream. Этот метод читает данные из файла и затем пишет их в массив byte. Существуют три параметра, первый из которых представляет позицию в массиве byte, куда нужно писать данные - обычно это ноль, чтобы начать писать данные из файла в начало массива. Последний параметр специфицирует количество байт для прочтения из файла.

В следующем практическом занятии демонстрируется чтение данных из файла произвольного доступа. Файл, из которого вы будете читать - это на самом деле файл класса, который создается для примера.

Практическое занятие Чтение ДЭННЫХ ИЗ фЭЙЛа

произвольного доступа

1. Создайте новое консольное приложение по имени ReadFile и сохраните его в каталоге С:\BegVCSharp\Chapter24.

2. Добавьте следующую директиву using в начало файла Program, cs:

using System;

using Systern.Collections.Generic; using System.Linq; using System.Text; using System. 10;



1 ... 243 244 245 [ 246 ] 247 248 249 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика