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