FileSystemWatcher缺少来自其他程序的文件更改

时间:2014-11-04 21:02:12

标签: c# filesystemwatcher

具体问题。我已经设置了一个程序来监视带有数字的文本文件的更改。

            FileSystemWatcher mikeWatcher = new FileSystemWatcher();
            System.IO.WaitForChangedResult postMike;
            string filePath = @"c:\path.txt";
            mikeWatcher.Path = Path.GetDirectoryName(filePath);
            mikeWatcher.Filter = Path.GetFileName(filePath);

            // Wait for change to the file
            postMike = mikeWatcher.WaitForChanged(System.IO.WatcherChangeTypes.Changed);

在此之后,一旦WaitForChanged标志完成,代码就会继续进行。

...

我遇到的问题是,当我手动更改文本文件并点击保存时成功触发标志,当其他程序(matlab)写入并保存到同一文件时,标志似乎不显示被触发。

我已经确认它确实是相同的文件被更改(路径是正确的)并且更改是在“上次修改日期”中注册的。此外,似乎matlab进程在保存后关闭文本文件,因此它不是发布问题,我不认为。

有任何想法或建议吗?我最容易改变我的c#代码然后更改matlab代码。欢迎所有建议!

3 个答案:

答案 0 :(得分:2)

我认为问题在于,matlab可能会删除文件并创建一个名称完全相同的新文件,因此文件最终不会被更改,而是新创建的。您也应该捕获已删除和已创建的事件,而不是仅更改。

尝试此示例中的代码:http://msdn.microsoft.com/en-us/library/t6xf43e0(v=vs.110).aspx

答案 1 :(得分:2)

此处的解决方案是停止使用FileSystemWatcher,而是使用计时器扫描目录以进行更改。

我曾尝试在两个项目中使用FileSystemWatcher,在这两种情况下我发现它太不可靠了。它会错过一些事件,延迟一些事件,并报告一些事件两次。我放弃了,从那时起就没用过它。

这个答案可能不受欢迎,但我确信使用FileSystemWatcher的唯一正确方法是在评论中,如下所示:

// Tried FileSystemWatcher, but it was far too unreliable.

答案 2 :(得分:0)

我遇到了完全相同的问题,并通过设置FW.EnableRaisingEvents = true;解决了这个问题。

奇怪,因为我不使用这些事件,但它有效。