如何在不触发无限循环的情况下编写FileSystemWatcher

时间:2018-05-31 07:09:59

标签: c# 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()写入修改后的文件时,它会触发FileSystemWatcher的Change事件,因为操作再次注册为write。

这会导致程序在覆盖刚刚编写的文件的无限循环中运行。

如何使用备份副本替换修改后的文件,而不会触发FileSystemWatcher要写入的其他事件?

1 个答案:

答案 0 :(得分:7)

除了您可以通过使用操作系统文件安全性f.e.以更好/不同的方式解决问题之外,您还有一些选择:

  • 暂时禁用观察者,在这种情况下,您可以在发生暴力攻击时丢失事件,这可能不是您想要的。
  • 列出包含您已重写文件的列表,忽略列表中文件的一项更改,然后将其从列表中删除 - >如果恶意程序知道这个
  • ,也会被滥用
  • 存储文件内容的SHA1或SHA256(或其他哈希),并且仅在散列不同时替换文件 - >可能是解决这个问题的最佳方法