Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 11. Файлы.doc
Скачиваний:
8
Добавлен:
02.05.2019
Размер:
168.96 Кб
Скачать

Байтовые файлы (потоки)

Ввод-вывод в файл на уровне байтов выполняется с помощью класса 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);

Console.ReadKey();

f.Close(); } }}

Результат работы программы: 100 0 1 2 3 4 5 6 7 8 9 10 9 8 7 6 0 0 0 0

4

5

Текущая позиция в потоке 7

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

Для установки желаемой позиции чтения используется метод Seek, имеющий два параметра: первый задает смещение в байтах относительно точки отсчета, задаваемой вторым. Точки отсчета задаются константами перечисления SeekOrigin: начало файла – Begin, текущая позиция – Current и конец файла – End.

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

FileStream f=new FileStream (@”D:\C#\test.txt”, FileMode.Create, FileAccess.ReadWrite);

В дословных литералах не требуется дублировать обратную косую черту.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]