【发布时间】:2016-11-22 04:17:22
【问题描述】:
C# 中的 FileSystemWatcher 有问题。 我观看了另一个程序使用的文件。 这不是问题。问题是随文件改变的唯一值是大小。另一个程序正在写入文件而不更新更改或写入日期。 并且大小值仅在(windows 7)资源管理器刷新(F5,或单击文件)时更新。
FileSystemWatcher fileWatcher = new FileSystemWatcher();
fileWatcher.Changed += new FileSystemEventHandler(fileWatcher_Changed);
fileWatcher.Path = Path.GetDirectoryName(path); // get directory of file path.
fileWatcher.Filter = Path.GetFileName(path); // only this file
fileWatcher.NotifyFilter = NotifyFilter.Size; // and maybe other
fileWatcher.EnableRaisingEvents = true;
private void fileWatcher_Changed(object sender, FileSystemEventArgs e)
{
// ...
}
我猜这个问题只能通过轮询来解决。因为应该触发文件刷新文件信息数据。 但我希望在没有轮询的情况下找到另一种解决方案。
关于我的申请: 读取正在使用另一个程序的文件。使用 FileStream FileShare.ReadWrite 可以获取文件的文本。它工作正常。我想在文件更改后更新文本框(读取文件)。但是在其他程序访问它时唯一正在更新的值是文件大小。但只有在资源管理器刷新或我单击文件时。这是这个问题的问题。如果问题无法解决,替代方法是:更新文件内容(读取文件)所有 x 次。 (轮询)没有文件观察器。
【问题讨论】:
-
"只有在 (windows 7) 资源管理器刷新(F5,或单击文件)时才会更新大小值。" -- 您是说
fileWatcher.Changed事件仅在您刷新已打开的 Windows 资源管理器窗口时触发,该窗口已打开到包含该文件的目录? -
是的,只有当 Windows 资源管理器打开并按 F5 刷新或单击文件时。我认为,FileSystemWatcher 只检查上一个。和实际值。默认情况下,大小值不会自行更新。也许它需要系统的大量资源。但仅当资源管理器用于打开目录,或按 F5 刷新或单击文件时。但是大小在变化,我在文件属性中看到了。
-
我在 Windows 资源管理器中看到了大小,我确信其他程序正在编写它。我没有 FileInfo 对象。我的应用程序用于在更改时读取此文件(大小已更改,因为更改日期未更新)。 FileStream FileShare.ReadWrite 可以实现。这使得可以读取另一个程序使用的文件。唯一的问题是大小信息(在资源管理器中更新的唯一值)在没有 Windows 资源管理器的情况下不会更新。看来我必须循环触发。但我不想要任何循环(轮询),只需要文件更改事件。
-
不,我的应用程序什么都不做,只是监听文件观察器。另一个程序正在以流的形式连续写入文件。当我在资源管理器中检查文件时,唯一更新的值是以字节为单位的大小。当更改事件被触发时,我的应用程序只是打印出一个文本。而且我看到该事件仅在我单击文件或在资源管理器中按 F5 时才会滴答作响。资源管理器间接触发了事件,因为字节的大小值仅在资源管理器更新时才发生变化。
-
很抱歉评论垃圾邮件,我在阅读您完全编辑的第一个回复之前回复了。我删除了多余的 cmets。重要信息在这里:“我的应用程序只是在触发更改事件时打印出一个文本。而且我看到该事件仅在我单击文件或在资源管理器中按 F5 时才在滴答作响”;这不是我期望它起作用的方式。现在问题已经澄清,也许有人知道 FileSystemWatcher 的一些注意事项以及它为什么会这样。
标签: c# filesystemwatcher windows-explorer