<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
можно организовать мониторинг файлов на предмет любых действий, указываемых значениями перечисления
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("***** 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>