Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Console.WriteLine("-> {0}", sb.ToString);

sb.Remove(0, "Hey!! ".Length);

Console.WriteLine("-> {0}", sb.ToString);

}

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

StringReader
, который (вполне ожидаемо) функционирует идентично
StreamReader
. Фактически класс
StringReader
лишь переопределяет унаследованные члены, чтобы выполнять чтение из блока символьных данных, а не из файла:

using (StringWriter strWriter = new StringWriter)

{

strWriter.WriteLine("Don't forget Mother's Day this year...");

Console.WriteLine("Contents of StringWriter:\n{0}", strWriter);

//
Читать данные из объекта StringWriter.

using (StringReader strReader = new StringReader(strWriter.ToString))

{

string input = null;

while ((input = strReader.ReadLine) != null)

{

Console.WriteLine(input);

}

}

}

Работа с типами BinaryWriter и BinaryReader

Последним набором классов средств чтения и записи, которые рассматриваются в настоящем разделе, являются

BinaryWriter
и
BinaryReader
; они оба унаследованы прямо от
System.Object
. Типы
BinaryWriter
и
BinaryReader
позволяют читать и записывать в поток дискретные типы данных в компактном двоичном формате. В классе
BinaryWriter
определен многократно перегруженный метод
Write
, предназначенный для помещения некоторого типа данных в поток. Помимо
Write
класс
BinaryWriter
предоставляет дополнительные члены, которые позволяют получать или устанавливать объекты производных от Stream типов; кроме того, класс
BinaryWriter
также предлагает поддержку произвольного доступа к данным (табл. 20.10).

Класс

BinaryReader
дополняет функциональность класса
BinaryWriter
членами, описанными в табл. 20.11.

В показанном далее примере (проект консольного приложения по имени

BinaryWriterReader
с оператором
using
для
System.IO
) в файл
*.dat
записываются данные нескольких типов:

using System;

using System.IO;

Console.WriteLine("***** Fun with Binary Writers / Readers *****\n");

// Открыть средство двоичной записи в файл.

FileInfo f = new FileInfo("BinFile.dat");

using(BinaryWriter bw = new BinaryWriter(f.OpenWrite))

{

// Вывести на консоль тип BaseStream

// (System.IO. Filestream в этом случае).

Console.WriteLine("Base stream is: {0}", bw.BaseStream);

// Создать некоторые данные для сохранения в файле.

double aDouble = 1234.67;

int anInt = 34567;

string aString = "A, B, C";

//
Записать данные.

bw.Write(aDouble);

bw.Write(anInt);

bw.Write(aString);

}

Console.WriteLine("Done!");

Console.ReadLine;

Обратите внимание, что объект

FileStream
, возвращенный методом
FileInfo.OpenWrite
, передается конструктору типа
BinaryWriter
. Применение такого приема облегчает организацию потока по уровням перед записью данных. Конструктор класса
BinaryWriter
принимает любой тип, производный от
Stream
(например,
FileStream
,
MemoryStream
или
BufferedStream
). Таким образом, запись двоичных данных в память сводится просто к использованию допустимого объекта
MemoryStream
.

Для чтения данных из файла

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

...

FileInfo f = new FileInfo("BinFile.dat");

...

// Читать двоичные данные из потока.

using(BinaryReader br = new BinaryReader(f.OpenRead))

{

Console.WriteLine(br.ReadDouble);

Console.WriteLine(br.ReadInt32);

Console.WriteLine(br.ReadString);

}

Console.ReadLine;

Программное слежение за файлами

Теперь, когда вы знаете, как применять различные средства чтения и записи, давайте займемся исследованием роли класса

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

IO.NotifyFilters:

public enum NotifyFilters

{

Attributes, CreationTime,

DirectoryName, FileName,

LastAccess, LastWrite,

Security, Size

}

Чтобы начать работу с типом

FileSystemWatcher
, в свойстве
Path
понадобится указать имя (и местоположение) каталога, содержащего файлы, которые нужно отслеживать, а в свойстве
Filter
— расширения отслеживаемых файлов.

В настоящий момент можно выбрать обработку событий

Changed
,
Created
и
Deleted
, которые функционируют в сочетании с делегатом
FileSystemEventHandler
. Этот делегат может вызывать любой метод, соответствующий следующей сигнатуре:

// Делегат FileSystemEventHandler должен указывать

// на методы, соответствующие следующей сигнатуре.

void MyNotificationHandler(object source, FileSystemEventArgs e)

Поделиться с друзьями: