【问题标题】:FileSystemWatcher Not Triggering CorrectlyFileSystemWatcher 未正确触发
【发布时间】:2012-09-12 13:12:03
【问题描述】:

好吧,直到我的列表框中的第一项出现,我的文件系统观察程序才会触发。但不会按该顺序创建列表框中列出的文件。

进一步解释...

我正在获取在文本框中输入的值,并将该值添加到列表框并更改图片框中该值旁边的图标。该图标将提醒用户 PDF 尚未创建。

    ListBox1.Items.Add(TextBoxTicketID.Text)

    If CStr(ListBox1.Items(0)) = TextBoxTicketID.Text Then
        PictureBoxStatus1.Image = My.Resources.Orange_Information
    ElseIf (ListBox1.Items(1)) = TextBoxTicketID.Text Then
        PictureBoxStatus2.Image = My.Resources.Orange_Information
    ElseIf (ListBox1.Items(2)) = TextBoxTicketID.Text Then
        PictureBoxStatus3.Image = My.Resources.Orange_Information
    End If

    TextBoxTicketID.Text = ""

    Call CheckPDFs()

以下是我当前检查 PDF 是否已创建的方式。

最终,在 msgbox 所在的私有子中,我想将 ID 旁边的图标更新为绿色复选标记,表示 PDF 已创建。

Public Sub CheckPDFs()
    Dim x As Integer
    Dim Watcher As New FileSystemWatcher()
    Watcher.Path = "C:\Temp\"
    Watcher.NotifyFilter = (NotifyFilters.Attributes)
    Watcher.Filter = ListBox1.Items(x) + ".pdf"

    AddHandler Watcher.Changed, AddressOf OnChanged

    Watcher.EnableRaisingEvents = True
End Sub

Private Shared Sub OnChanged(source As Object, e As FileSystemEventArgs)
    Dim x As Integer
    ' Specify what is done when a file is created.
    MsgBox("File has been created!")
End Sub

当我运行测试时,我创建了两个输入到列表框中的唯一 ID。

问题 1:我通过输入的第一个 ID 手动创建 PDF,没有任何触发。在触发 msgbox 之前,我必须将 PDF 移出目录并返回。

问题 2:如果我输入了两个 ID,我手动创建了第二个 ID,没有任何触发。我将文件移出目录并重新移入,仍未触发。

为什么在触发后面输入的任何 ID 之前,第一个 ID 必须存在?

编辑

这里有两个屏幕截图,用户输入之前和之后,显示输入的 ID 和图标。

Before_IDs_Entered

After_IDs_Entered

【问题讨论】:

    标签: visual-studio-2010 filesystemwatcher


    【解决方案1】:

    您的代码未显示您如何设置 Watcher.NofityFilter。如果您希望在文件完成写入并准备好使用时引发事件,那么您必须按如下方式设置它:

    Watcher.NotifyFilter = NotifyFilters.Attributes;
    

    然后删除您列出的Watcher.Created 事件;您只想拥有Changed。否则,您将收到两个事件:一个是正在创建的文件,其中包含零字节,另一个是文件完成写入时。我相信您只关心文件完成写入。

    【讨论】:

    • 是的,我只关心文件的写入完成。我采纳了您的建议,添加了 Watcher.NotifyFilter 并删除了 Watcher.Created 事件,但它仍然没有触发我输入的第二个 ID。这就像它在触发第二个之前等待第一个被创建。它与Dim x as Integer 和我检查列表框的行有什么关系吗? Watcher.Filter = ListBox1.Items(x) + ".pdf"
    • 好吧,您的代码没有为“x”设置值,这意味着它默认为零。这意味着只要求观察者观察该列表中位置为零的任何文件。请记住,FileSystemWatcher 可以观察一个模式,而不是一个集合。换句话说,“*.pdf”它可以观看,但没有明确命名的条目,例如“Alpha.pdf|Beta.pdf|Charlie.pdf”。
    • 有没有办法添加一个循环来增加“x”值?通过它默认为零,我现在明白为什么它会等待列表框中的第一个项目出现后再前进。意思是Listbox1.items(x) 将等于零。
    • 或者有没有更好的方法来确保列表框中列出的任何文件,在列表框中都生成了同名的 PDF?
    • 您可以执行Watcher.Filter = "MyFolder.*pdf" 然后使用您的事件的FileSystemEventArgs e 参数来确定实际更改的文件:e.FullPath 包含更改的文件的名称。将其与列表中的内容相匹配,您就完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多