Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_1 / С_17_Работа с файлами.ppt
Скачиваний:
18
Добавлен:
19.04.2015
Размер:
1.71 Mб
Скачать

17.2.1 Потоки, связанные с файлами

Для потоков, связанных с файлами, определено также такое понятие, как текущая позиция внутри файла.

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

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

Если вам нужно создать входной или выходной поток, связанный с локальным файлом, содержащим двоичные

данные, следует воспользоваться классами BinaryWriter и BinaryReader.

Для чтения из файла или записи в файл текстовых данных обычно используются классы StreamReader и StreamWriter.

17.2.2 Работа с двоичными файлами

Для работы с двоичными файлами вначале следует создать поток класса Filestream, воспользовавшись соответствующим конструктором, например:

FileStream fs =

new FileStream("myfile.dat",

FileMode.CreateNew);

В качестве первого параметра конструктору необходимо передать полный путь к файлу или имя файла, а в качестве

второго — режим открытия потока. Виды режимов:

Append – если файл существует, он открывается. Текущая позиция устанавливается на конец файла. Если указанного файла нет, то он создается. Этот режим можно использовать

только совместно с режимом доступа FileAccess.Write. Create – ОС должна создать новый файл. Если указанный файл уже существует, он будет перезаписан.

Open – Требуется открыть существующий файл. Указатель

ставится на начало файла.

Truncate – Требуется открыть существующий файл. После

В классе FileStream существует конструктор, позволяющий определить не только путь к файлу, но и режим его открытия:

FileStream fs = new FileStream(name,

FileMode.Open,

FileAccess.Read);

Режим доступа задается как статическая константа класса FileAccess.

Read Доступ только на чтение ReadWrite Доступ на чтение и запись Write Доступ на запись

После создания потока на базе файла (FileStream) следует на базе этого потока создать потоки классов BinaryWriter и BinaryReader, предназначенные соответственно для записи в

файл и чтения из файла двоичных данных:

BinaryWriter bw = new BinaryWriter(fs); BinaryReader br = new BinaryReader(fs);

После того как программа завершила работу с потоками, она должна их закрыть. Для закрытия потоков используется метод Close.

Закрываются потоки в порядке, обратном открытию:

FileStream fs = new FileStream("myfile.dat",

FileMode.CreateNew);

BinaryWriter bw = new BinaryWriter(fs); BinaryReader br = new BinaryReader(fs);

// Работа с потоками

bw.Close();

br.Close();

Для записи в файл двоичных данных используется метод Write:

Write(<параметр>);

При этом параметр должен иметь один из стандартных типов данных (bool, byte , int, long, double, float, char, string и др.). Параметром может быть массив целых чисел или символов:

Write(byte[]);

Write(char[]);

Можно записать только часть массива:

Write(byte[], <from>, <count>);

Write(char[], <from>, <count>);

где <from> и <count> целые числа, указывающие с какого индекса начать и сколько элементов записать.

При записи в двоичный поток текстовой строки string она будет предваряться префиксом, содержащим значение длины строки. Строка будет записана в кодировке ASCII.

Чтобы прочитать данные из потока BinaryReader, нужно использовать один из методов, специально предусмотренных для этого в классе BinaryReader. Например: ReadByte(),

ReadChar(), ReadDouble() и т.п.

Для записи в файл двоичных данных используется метод Write:

Write(<параметр>);

При этом параметр должен иметь один из стандартных типов данных (bool, byte , int, long, double, float, char, string и др.). Параметром может быть массив целых чисел или символов:

Write(byte[]);

Write(char[]);

Можно записать только часть массива:

Write(byte[], <from>, <count>);

Write(char[], <from>, <count>);

где <from> и <count> целые числа, указывающие с какого индекса начать и сколько элементов записать.

При записи в двоичный поток текстовой строки string она будет предваряться префиксом, содержащим значение длины строки. Строка будет записана в кодировке ASCII.

Чтобы прочитать данные из потока BinaryReader, нужно использовать один из методов, специально предусмотренных для этого в классе BinaryReader. Например: ReadByte(),

ReadChar(), ReadDouble() и т.п.

Пример: создание двоичного файла, запись и чтение данных

string testFile = @"d:\MyData.dat"; if(File.Exists(testFile))

{

MessageBox.Show("Файл " + testFile + " уже существует" );

return;

}

// Создание файла и запись чисел FileStream fs = new FileStream(testFile, FileMode.Create);

BinaryWriter bw = new BinaryWriter(fs); bw.Write("Text

for(int i = 0;

{

bw.Write(i);

}

bw.Close();

// чтение из файла

fs = new FileStream(testFile, FileMode.Open, FileAccess.Read);

BinaryReader br = new BinaryReader(fs); string s = br.ReadString();

int k;

for (int i=0; i < 10; i++)

{

k = br.ReadInt32();

s += k.ToString() + "\n";

};

br.Close();

fs.Close();

MessageBox.Show("Содержимое файла + testFile + "\n" + s );

17.2.3 Работа текстовыми файлами

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

Приемы использования потоков StreamWriter и StreamReader рассмотрим на примере записи в файл и чтения из него набора строк:

private void button2_Click(object sender, EventArgs e)

{

string testFile = @"d:\MyData.txt"; if (File.Exists(testFile))

{

MessageBox.Show("Файл " + testFile + " уже существует");

return;

}

StreamWriter sw = File.CreateText(testFile); sw.Write("Строка 1\n"); sw.WriteLine("Строка 2");

sw.WriteLine("0 1 2 3 4 5 6 7 8 9"); sw.Close();

string s = "";

StreamReader sr = File.OpenText(testFile); while (true)

{

string str = sr.ReadLine(); if (str == null) break;

s += str+"\n";

}

sr.Close();

MessageBox.Show("Содержимое файла "

+ testFile + "\n" + s);