【问题标题】:FileSystemWatcher changed event not firing for recently opened fileFileSystemWatcher 更改的事件未针对最近打开的文件触发
【发布时间】:2014-06-27 22:33:22
【问题描述】:

我在 Windows 窗体应用程序中实现了 FileSystemWatcher。当我第一次打开文件(比如 pdf-1)时,更改的事件正在工作。但是当我在短时间内第二次打开同一个文件时,更改的事件不会触发。但是当我打开另一个文件(比如pdf-2)时它会触发。再次,仅当我在一段时间后(例如 1 或 2 小时)打开第一个文件(pdf-1)时,才会触发更改的事件。

我将InternalBufferSize设置为16KB,使用的NotifyFilters是LastAccess、LastWrite、FileName和DirectoryName。

我无法找出问题所在。谁能帮帮我?

【问题讨论】:

  • 我怀疑由于该文件是最近打开的,它仍然在 RAM 缓存中。因此,当您第二次打开它时,它实际上并不涉及文件系统。我可能对此完全不感兴趣,但看看你是否可以明确地检测到文件何时打开,而不仅仅是文件系统发生变化时。那可能有一些不同。或者,它可能完全是其他人必须提出的建议
  • 查看here 了解有关 NTFS 将更新延迟最多一小时以进行最后一次访问的信息。
  • @RussellUhl 是的,即使我猜到了同样的原因。但我不确定,也不知道如何从 RAM 缓存/操作系统缓存中清除文件
  • @HABO 那么,有没有办法避免 c# 中最后一次访问的延迟?
  • 使用行为更符合您喜好的文件系统(虽然我不知道有哪一种)或编写您自己的文件系统。您无法通过轮询来解决它,因为 NTFS 不会在一小时内更新文件头以进行多次访问。如果访问文件的应用程序都是您自己的,那么您可以修改它们以生成通知,但对于 PDF 来说似乎不太可能。

标签: c# filesystemwatcher


【解决方案1】:

我看到similar results 带有FileSystemWatcher,用于启用写入缓存的 RAID 控制器磁盘、SCSI 磁盘和常规 IDE 磁盘。

我还遇到了很多其他可能由thread synchronization problems 引起的错误。 Here is another description of this problem.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多