Как написать FileSystemWatcher без запуска бесконечного цикла
Как мне записать файл в C# в путь к папке, который отслеживается FileSystemWatcher?
Мои настройки fileSystemWatcher следующие:
public FileSystemWatcher CreateAndExecute(string path)
{
Console.WriteLine("Watching " + path);
//Create new watcher
FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();
fileSystemWatcher.Path = path;
fileSystemWatcher.IncludeSubdirectories = false;
fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite |
NotifyFilters.FileName | NotifyFilters.DirectoryName;
fileSystemWatcher.Filter = "*.txt";
fileSystemWatcher.Changed += new FileSystemEventHandler(OnChange);
fileSystemWatcher.InternalBufferSize = 32768;
//Execute
fileSystemWatcher.EnableRaisingEvents = true;
}
private void OnChange(object source, FileSystemEventArgs e)
{
//Replace modified file with original copy
}
Я хочу заменить содержимое измененного файла резервной копией из базы данных всякий раз, когда в файл происходит несанкционированная запись (вне программы).
Однако, когда я пишу с помощью File.WriteAllText() в измененный файл, он вызывает событие Change с помощью FileSystemWatcher, когда действие снова регистрируется как запись.
Это заставляет программу работать в бесконечном цикле перезаписи только что записанного файла.
Как заменить измененный файл резервной копией, не вызывая другое событие для записи с помощью FileSystemWatcher?
1 ответ
Помимо того факта, что вы, вероятно, можете решить проблему лучше / другим способом с помощью системы безопасности файлов ОС, у вас есть несколько вариантов:
- Временно отключите наблюдателя, в этом случае вы можете потерять события в случае атаки грубой силы, которая может не соответствовать вашим ожиданиям.
- Сохраните список с файлами, которые вы переписали, игнорируйте одно изменение для файлов в списке и впоследствии удалите его из списка -> также можно злоупотреблять, если вредоносная программа знает об этом
- Сохраните SHA1 или SHA256 (или другой хэш) содержимого файла и заменяйте файл только в том случае, если хеш отличается -> вероятно, лучший подход для этой проблемы