Язык программирования C#9 и платформа .NET5
Часть 370 из 642 Информация о книге
<b> // Записать данные.</b>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");...<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.SystemIO.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.0using System;using System.IO;Console.WriteLine("***** The Amazing File Watcher App *****\n");<b>// Установить путь к каталогу, за которым нужно наблюдать.</b>FileSystemWatcher watcher = new FileSystemWatcher();try{watcher.Path = @".";}catch(ArgumentException ex){Console.WriteLine(ex.Message);return;}<b>// Указать цели наблюдения.</b>watcher.NotifyFilter = NotifyFilters.LastAccess| NotifyFilters.LastWrite| NotifyFilters.FileName| NotifyFilters.DirectoryName;<b>// Следить только за текстовыми файлами.</b>watcher.Filter = "*.txt";<b>// Добавить обработчики событий.</b><b>// Указать, что будет происходить при изменении,</b>