【问题标题】:How can I make sure this is the last change in FileSystemWatcher onChanged event?如何确保这是 FileSystemWatcher onChanged 事件中的最后一次更改?
【发布时间】:2015-02-25 13:39:12
【问题描述】:

我正在使用FileSystemWatcher 读取由另一个应用程序写入的文件的内容。发生的事件如下:

  1. 首先,onCreated 事件发生。
  2. 然后,onChanged 事件发生,次数未知(有时是 2 次,有时是 3 次,有时是 4 次)。

onChanged 事件的处理程序中,是否有技巧知道这是该文件最后一次被其他应用程序写入?

【问题讨论】:

  • 理论上,显然没有。除非您对其他应用程序有专门的了解,否则您如何知道它正在做什么以及将要做什么?
  • 你可以启动一个BGW或线程来“监视”新文件;尝试以独占方式打开它,当您不再收到 IO 异常时,它是完整的或至少可以安全使用/复制/移动/打开。如果它在第一次尝试前等待 1-2 秒,您可能会在第一次尝试时成功,如果在重试之前没有提供超时。在出现问题且仍处于锁定状态的情况下,最大尝试救助可能是合适的。
  • 同意 Pluto - 唯一可以确定的方法是锁定文件。这可能会导致其他应用程序出现异常。
  • 请参阅weblogs.asp.net/ashben/31773 显然引发的多个事件是一个已知问题
  • 就像 PMF 所说,除非您了解其他应用程序,否则无法知道。如果您知道应用程序需要 10 秒进行修改,您可以等待 15 秒再访问文件。

标签: .net vb.net filesystemwatcher


【解决方案1】:

通过检查相关文件上的File.GetLastWriteTime 时间戳,可以检测并丢弃来自FileSystemWatcher 的任何重复的OnChanged 事件。像这样:

Private lastRead As DateTime = DateTime.MinValue

Private Sub OnChanged(source As Object, a As FileSystemEventArgs)
    Dim lastWriteTime As DateTime = File.GetLastWriteTime(uri)
    If lastWriteTime <> lastRead Then
        doStuff()
        lastRead = lastWriteTime
    End If
    ' else discard the (duplicated) OnChanged event
End Sub

另一种方法正在讨论here

【讨论】:

    【解决方案2】:

    我通常通过等待预定义的时间来处理这些问题,并验证文件自上次检查以来没有更改。

    IE:

    更改事件触发

    开始计时器(这些天使用任务)(通常为一些小时间〜秒)

    如果更改事件再次触发,重置计时器/任务延迟

    一旦任务执行,这意味着写入已经稳定了至少几秒钟,表明文件访问已完成。

    *根据文件大小和访问程序,在某些情况下可能需要调整超时

    【讨论】:

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