4

我有以下子:

  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 秒。它应该是微不足道的,但由于某种原因,它今天没有出现在我的脑海中,我的思绪也没有围绕着我在谷歌上找到的答案。

谢谢,斯科特

4

7 回答 7

10

几年前,我创建了一项服务来上传转储到 FTP 文件夹的文件,以下是我所做的一些事情,可以帮助您解决问题:

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

这似乎对我有用,并且该服务可靠地运行了几个月上传文件,直到我离开那份工作。

于 2008-12-20T06:11:55.623 回答
3

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

于 2008-12-19T21:03:44.310 回答
3

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

有点笨拙,但它奏效了。

于 2008-12-19T21:14:41.357 回答
2

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

于 2008-12-31T15:21:41.483 回答
1

我遇到了同样的问题,我正在保存一个通过代码上传的文件,删除和创建每次都会触发两次。我所要做的就是在处理之前检查文件是否存在。

private void fsw_Created(object sender, FileSystemEventArgs e)
{
   if (File.Exists(e.FullPath))
   {
      //process the file here
   }
}
于 2009-05-26T20:25:02.497 回答
0

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

我曾短暂地考虑过使用计时器机制来过滤掉更改通知,但感觉就像 pete-m,但我觉得这是一个太不干净的解决方案。

我尝试仅查看 LastWrite 时间更改,但这没有用。我仍然收到重复的通知。

于 2014-11-26T18:47:45.840 回答
0

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

因此,当特定的 excel 文件发生更改时,我无法获得简单的通知。

于 2018-12-12T20:07:19.353 回答