Использование классов файловых потоков в программе предполагает следующие операции:
Создание потока и связывание его с физическим файлом.
Обмен информацией (чтение-запись).
Закрытие файла.
Каждый файл можно создавать разными способами и открывать в различных режимах (файлы можно открывать для чтения, только для записи или для чтения и записи).
Режимы доступа к файлу содержаться в переменной FileAccess, определенном в пространстве имен System.IO. Константы перечисления приведены в таблице 11.2.
Таблица 11.2- Значения FileAccess
Read Открыть файл только для чтения
ReadWrite Открыть файл для чтения и записи
Write Открыть файл для записи
Возможные режимы открытия файла определены в переменной FileMode (таблица 11.3)
Таблица 11.3 - Значения FileMode
Append Открыть файл, если он существует, и установить текущий
указатель в конец файла. Если файл не существует, создать
новый файл
Create Создать новый файл. Если в каталоге уже существует файл с
таким же именем, он будет стерт
CreateNew Создать новый файл. Если в каталоге уже существует файл с
таким же именем, возникает исключение IOException
Open Открыть существующий файл
OpenOrCreate Открыть файл, если он существует. Если нет создать файл с
таким именем
Truncate Открыть существующий файл. После открытия он должен быть
обрезан до нулевой длины
Режим FileMode.Append можно использовать только совместно с доступом типа FileAccess.Write, то есть для файлов, открываемых для записи.
Байтовые файлы (потоки)
Ввод-вывод в файл на уровне байтов выполняется с помощью класса FileStream, основные элементы которого представлены в таблице 11.4.
Таблица 11.4 - Элементы класса Stream
Элемент Описание
BeginRead, Начать асинхронный ввод или вывод
BeginWrite
CanRead, Свойства, определяющие, какие операции поддерживает поток: чтение,
CanSeek, прямой доступ и/или запись
CanWrite
Close Закрыть текущий поток и освободить связанные с ним ресурсы (сокеты,
указатели на файлы)
EndRead, Ожидать завершения асинхронного ввода; закончить асинхронный вывод
EndWrite
Flush Записать данные из буфера в связанный с потоком источник данных
и очистить буфер. Если для данного потока буфер не используется,
то этот метод ничего не делает
Length Возвратить длину потока в байтах
Position Возвратить текущую позицию в потоке
Read, Считать последовательность байтов (или один байт) из текущего потока
ReadByte и переместить указатель в потоке на количество считанных байтов
Seek Установить текущий указатель потока на заданную позицию
SetLength Установить длину текущего потока
Write, Записать последовательность байтов (или один байт) в текущий поток
WriteByte и переместить указатель в потоке на количество записанных байтов
Байтовый поток класс FileStream реализует эти элементы для работы с дисковыми файлами. Для определения режимов работы с файлом используются стандартные перечисления FileMode, FileAccess.
Пример работы с байтовым файлом
//Демонстрация чтения и записи одного байта и массива байтов, а также //позиционирование в потоке.
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
//создание файловой переменной и связывание с байтовым потоком - //файлом на диске с именем est.txt
// файл создается для чтения и записи
FileStream f=new FileStream("est.txt",
FileMode.Create, FileAccess.ReadWrite );
f.WriteByte( 100 ); //в начало файла записывается число 100
byte[] x=new byte[10];
for ( byte i=0; i<10; ++i)
{
x[i]=(byte)(10-i);
f.WriteByte(i); // записывается 10 чисел от 0 до 9
}
f.Write( x, 0, 5 ); //записывается 5 элементов массива
byte[] y=new byte[20];
f.Seek( 0, SeekOrigin.Begin ); //текущий указатель – на начало
f.Read( y, 0, 20 ); //чтение из файла в массив
foreach ( byte elem in y ) Console.Write( " " + elem );
Console.WriteLine();
f.Seek(5, SeekOrigin.Begin); //текущий указатель – на 5-ый элемент
int a = f.ReadByte(); //чтение 5-го элемента
Console.WriteLine( a );
a = f.ReadByte(); //чтение 6-го элемента
Console.WriteLine( a );
Console.WriteLine("Текущая позиция в потоке " + f.Position);
Текущая позиция в потоке первоначально устанавливается на начало файла (для любого режима открытия, кроме Append) и сдвигается на одну позицию при записикаждого байта.
Для установки желаемой позиции чтения используется метод Seek, имеющий два параметра: первый задает смещение в байтах относительно точки отсчета, задаваемой вторым. Точки отсчета задаются константами перечисления SeekOrigin: начало файла – Begin, текущая позиция – Current и конец файла – End.
В данном примере файл создавался в текущем каталоге. Можно указать и полный путь к файлу, при этом удобнее использовать дословные литералы, например