Литмир - Электронная Библиотека
A
A

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

  bw.Write(aDouble);

  bw.Write(anInt);

  bw.Write(aString);

}

Console.WriteLine(&quot;Done!&quot;);

Console.ReadLine();

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

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

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

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

...

FileInfo f = new FileInfo(&quot;BinFile.dat&quot;);

...

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

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
. Этот делегат может вызывать любой метод, соответствующий следующей сигнатуре:

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

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

void MyNotificationHandler(object source, FileSystemEventArgs e)

Событие

Renamed
может быть также обработано с использованием делегата
RenamedEventHandler
, который позволяет вызывать методы с такой сигнатурой:

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

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

<b>void MyRenamedHandler(object source, RenamedEventArgs e)</b>

В то время как для обработки каждого события можно применять традиционный синтаксис делегатов/событий, вы определенно будете использовать синтаксис лямбда-выражений.

Давайте взглянем на процесс слежения за файлом. Показанный ниже проект консольного приложения(

MyDirectoryWatcher
с оператором
using
для
System.IO
) наблюдает за файлами
*.txt
в каталоге
bin\debug\net5.0
и выводит на консоль сообщения, когда происходит их создание, удаление, модификация и переименование:

using System;

using System.IO;

Console.WriteLine(&quot;***** The Amazing File Watcher App *****\n&quot;);

<b>// Установить путь к каталогу, за которым нужно наблюдать.</b>

FileSystemWatcher watcher = new FileSystemWatcher();

try

{

  watcher.Path = @&quot;.&quot;;

}

catch(ArgumentException ex)

{

 Console.WriteLine(ex.Message);

  return;

}

<b>// Указать цели наблюдения.</b>

watcher.NotifyFilter = NotifyFilters.LastAccess

  | NotifyFilters.LastWrite

  | NotifyFilters.FileName

  | NotifyFilters.DirectoryName;

<b>// Следить только за текстовыми файлами.</b>

watcher.Filter = &quot;*.txt&quot;;

<b>// Добавить обработчики событий.</b>

<b>// Указать, что будет происходить при изменении,</b>

370
{"b":"847442","o":1}