我如何确定这是 FileSystemWatcher onChanged 事件中的最后一次更改?
How can I make sure this is the last change in FileSystemWatcher onChanged event?
我正在使用 FileSystemWatcher
读取由另一个应用程序写入的文件的内容。发生的事件如下:
- 首先,
onCreated
事件发生。
- 然后,
onChanged
事件发生,次数未知(有时是 2 次,有时是 3 次,有时是 4 次)。
在 onChanged
事件的处理程序中,是否有技巧可以知道这是该文件最后一次被其他应用程序写入?
任何来自 FileSystemWatcher
的重复 OnChanged
事件都可以通过检查相关文件的 File.GetLastWriteTime
时间戳来检测和丢弃。像这样:
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
我通常通过等待预定义的时间超时并验证文件自上次检查以来没有更改来处理这些问题。
IE:
更改事件触发
启动计时器(最近使用任务)(通常为少量时间~秒)
如果更改事件再次触发,重置 timer/task 延迟
任务执行后,表示写入至少稳定了几秒钟,表明文件访问已完成。
*在某些情况下可能需要调整超时,具体取决于文件大小和访问程序
我正在使用 FileSystemWatcher
读取由另一个应用程序写入的文件的内容。发生的事件如下:
- 首先,
onCreated
事件发生。 - 然后,
onChanged
事件发生,次数未知(有时是 2 次,有时是 3 次,有时是 4 次)。
在 onChanged
事件的处理程序中,是否有技巧可以知道这是该文件最后一次被其他应用程序写入?
任何来自 FileSystemWatcher
的重复 OnChanged
事件都可以通过检查相关文件的 File.GetLastWriteTime
时间戳来检测和丢弃。像这样:
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
我通常通过等待预定义的时间超时并验证文件自上次检查以来没有更改来处理这些问题。
IE:
更改事件触发
启动计时器(最近使用任务)(通常为少量时间~秒)
如果更改事件再次触发,重置 timer/task 延迟
任务执行后,表示写入至少稳定了几秒钟,表明文件访问已完成。
*在某些情况下可能需要调整超时,具体取决于文件大小和访问程序