Язык программирования 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)
Поделиться с друзьями: