在FileSystemWatcher中处理多个更改事件

时间:2008-12-19 19:33:38

标签: vb.net filesystemwatcher

我有以下子项:

  Private Sub Watcher_Changed(ByVal sender As System.Object, ByVal e As FileSystemEventArgs)
        If Path.GetExtension(e.Name) = ".p2p" Then
            Exit Sub
        Else
            Try
                ' multiple change events can be thrown. Check that file hasn't already been moved.
                While Not File.Exists(e.FullPath)
                    Exit Try
                End While

                ' throw further processing to a BackGroundWorker
                ChangedFullPath = e.FullPath
                ChangedFileName = e.Name

                FileMover = New BackgroundWorker
                AddHandler FileMover.DoWork, New DoWorkEventHandler(AddressOf ProcessFile)
                FileMover.RunWorkerAsync()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

        End If
    End Sub

当FTP上传文件时,我仍然收到多个更改文件通知。

我想修改Try,所以它也会抛出更改通知,如果它发生在过去(时间) - 让我们说3秒。它应该是微不足道的,但由于某种原因它今天不会出现在我身上,而我的思绪并没有围绕我在谷歌上找到的答案。

谢谢, 斯科特

7 个答案:

答案 0 :(得分:10)

我创建了一个服务来上传几年前转储到FTP文件夹的文件,这里有一些我应该帮你解决问题的事情:

  1. 我测试了所有NotifyFilters并选择了删除重复通知的那个(使用 NotifyFilters.Size为每个创建的文件提供了可靠的通知,并且几乎消除了所有重复的通知)
  2. 在Watcher_Changed事件中,我忽略了事件args中包含的文件,只处理了当前文件夹中的所有文件;我尝试将文件夹中的所有文件添加到队列中,如果它们已经在队列中,我跳过下面的3。
  3. 我为找到的每个唯一新文件分拆了一个新线程;我的线程尝试获取文件的锁定,如果不能这意味着其他进程仍在访问它(它仍在上传等),所以我的线程会在短暂的间隔后休眠并再次尝试。
  4. 当文件被完全处理时,线程所做的最后一件事就是将其移动到一个存档文件夹,然后将其从队列中删除,这样就不会再次意外处理它。
  5. 这似乎对我有用,并且该服务可靠地上传文件数月,直到我离开那份工作。

答案 1 :(得分:3)

我们有类似的情况;但是,批量编写文件的系统使用临时名称,并在完成后将其更改为“真实”名称。您的ftp客户端可以做类似的事情吗? 如果可以,那么您可以检查新文件名并通过扩展名或前缀进行检查;如果它不是预期的最终文件名格式,那么你可以忽略它。

答案 2 :(得分:3)

我之前遇到过这种情况,并最终实现了一个定时器机制来等待文件“稳定”,或者写入事件停止进入x时间。

有点笨拙,但确实有效。

答案 3 :(得分:2)

需要注意的一点是,访问文件可以更改其中一个文件属性,例如“访问时间”等。如果您没有正确设置通知过滤器,则可以触发另一个事件。

答案 4 :(得分:1)

我有同样的问题,我保存了一个通过代码上传的文件,删除和创建每次都会触发两次。在进行处理之前,我必须检查文件是否在那里。

private void fsw_Created(object sender, FileSystemEventArgs e)
{
   if (File.Exists(e.FullPath))
   {
      //process the file here
   }
}

答案 5 :(得分:0)

我尝试在更改时自动重新加载配置文件时遇到了同样的问题。我最终计算了文件的MD5哈希,以确定文件是否实际已更改,并且只有在哈希值不同时才重新加载。这是我可以过滤掉重复的唯一确定方式。

我简单地想过使用一个计时器机制来过滤掉变更通知但感觉就像pete-m一样,但我觉得它太不干净了。

我尝试仅观看LastWrite时间更改,但这不起作用。我还在收到重复的通知。

答案 6 :(得分:0)

我正在尝试检测excel文件何时发生更改,但遇到了一个问题,即更改后的事件无法触发,并且因为我只关注单个文件设置,因此过滤器无法正常工作。当我删除过滤器并查看触发的事件时,事件参数名称属性看起来是随机生成的名称,而不是我知道已更改的特定文件名。

因此,当特定的excel文件更改时,我无法收到简单的通知。