0

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

进一步解释...

我正在获取在文本框中输入的值,并将该值添加到列表框中,并在图片框中更改该值旁边的图标。该图标将提醒用户 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

4

1 回答 1

1

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

Watcher.NotifyFilter = NotifyFilters.Attributes;

Then remove the Watcher.Created event you have listed; you want to have only the Changed. Otherwise you will receive two events: one for the file being created with zero bytes in it, and the other for when the file is done being written. I believe you only care when the file is done being written.

于 2012-09-12T13:36:27.360 回答