- •Лекция 11. Файлы в с# Основные понятия. Классы .Net для работы с файлами
- •Виды файлов
- •Алгоритм работы с файловыми потоками
- •Байтовые файлы (потоки)
- •Обработка исключительных ситуаций при работе с файлами
- •Текстовые файлы
- •Пример преобразования чисел, содержащихся в текстовом файле
- •Консольный ввод-вывод
- •Работа с каталогами и файлами
Байтовые файлы (потоки)
Ввод-вывод в файл на уровне байтов выполняется с помощью класса 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);
В дословных литералах не требуется дублировать обратную косую черту.