Seria pytań uczestników, które pojawiły się podczas szkolenia .NET Core 3.1 realizowanego w dniach 7-11.12.2020 r.
Do śledzenia plików służy klasa FileSystemWatcher z przestrzeni System.IO.
Wystarczy utworzyć instancję tej klasy oraz podpiąć się pod zdarzenia:
Created - plik został utworzony
Changed - zawartość pliku została zmieniona
Renamed - nazwa pliku uległa zmianie
Deleted - pliku został usunięty
Uwaga: należy włączyć obsługę tych zdarzeń:
EnableRaisingEvents = true;
gdyż w przeciwnym przypadku nie będzie działać.
Dodatkowo możemy filtrować pliki, które nas interesują, np. txt i bmp
Przykład:
private static void MonitorDirectory(string directory)
{
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
fileSystemWatcher.Path = directory;
// fileSystemWatcher.Filter = "*.txt";
fileSystemWatcher.Filters.Add("*.txt");
fileSystemWatcher.Filters.Add("*.bmp");
fileSystemWatcher.Created += FileSystemWatcher_Created;
fileSystemWatcher.Changed += FileSystemWatcher_Changed;
fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;
fileSystemWatcher.EnableRaisingEvents = true;
}
private static void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
{
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();
}
private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();
}
private static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();
}
private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"{e.ChangeType} {e.Name}");
Console.ResetColor();
}
Można zaimplementować własny Middleware lub skorzystać z gotowej biblioteki AspNetCoreRateLimit.
Liczniki można przechowywać w pamięci, albo w bazie danych REDIS dzięki czemu nasze rozwiązanie będzie bardziej skalowalne.
Biblioteka AspNetCoreRateLimit wspiera REDIS:
https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/Using-Redis-as-a-distributed-counter-store
Więcej na temat samego REDIS'a można przeczytać tutaj.
Proponuję skorzystać z klasy SqlDependency:
Należy włączyć Service Broker w SQL Server
ALTER DATABASE MyDatabase SET ENABLE_BROKER
http://elvanydev.com/SignalR-Core-SqlDependency-part2/