Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекции C# for print fineprint.docx
Скачиваний:
325
Добавлен:
24.02.2016
Размер:
523.48 Кб
Скачать

Виды файлов

Информация, обрабатываемая фалами в С# может быть в виде:

  • двоичного представления данных(классы BinaryReader, BinaryWriter);

  • байтов (FileStream);

  • текста, то есть символов (StreamWriter, StreamReader).

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

Соответственно, различают текстовые, двоичные и байтовые файлы.

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

Текстовые файлы позволяют выполнять только последовательный доступ, в двоичных и байтовых потоках можно использоватьоба метода.

Методы форматированного ввода (ЧТЕНИЯ)значений арифметических типов, в С# не поддерживаются. Для преобразования из символьного в числовое представление используются методы классаConvertили методParse.

Форматированный вывод (ЗАПИСЬ)выполняется с помощью методаToString, результаты выполнения которых передаются в методы текстовых файлов.

Алгоритм работы с файловыми потоками

Использование классов файловых потоков в программе предполагает следующие операции:

  1. Создание потока и связывание его с физическим файлом.

  2. Обмен информацией (чтение-запись).

  3. Закрытие файла.

Каждый файл можно создавать разными способами и открывать в различных режимах (файлы можно открывать для чтения, только для записи или для чтения и записи).

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

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);

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