【问题标题】:C# FileSystemWatcher file size is only updating with windows explorerC# FileSystemWatcher 文件大小仅使用 Windows 资源管理器更新
【发布时间】: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


【解决方案1】:

也许,以下将解决您的问题,并避免轮询。尝试使用 WMI,查询 root\cimv2 命名空间,例如:

select filesize from 'cim_datafile' where name='_your_path_'

从 C# 应用时可能会略有不同,但沿着这些思路。关于 WMI,有很多教程如何在 .NET 中初始化 WMI 侦听器。四处搜寻。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多