循环直到文件存在

时间:2012-09-11 17:17:24

标签: vb.net visual-studio-2010 loops

好的,以下代码显示了我如何在文本框中输入值,将该值添加到列表框,更新旁边的图片框并消隐文本框,以便用户可以向列表框添加其他值。

    ListBox1.Items.Add(TextBoxTicketID.Text)

    If CStr(ListBox1.Items(0)) = TextBoxTicketID.Text Then
        PictureBoxStatus1.Image = My.Resources.Orange_Information
    End If

    TextBoxTicketID.Text = ""

我还有另一个未在此处显示的流程,它将根据输入列表框的值创建PDF。

如果PDF存在与否,我在检查特定目录时遇到问题。当PDF存在时,我将图片框更改为另一个图像。

这是我正在使用的循环,但我遇到的问题是除非第一个值存在,否则用户无法输入第二个值。

Loop Until My.Computer.FileSystem.FileExists("c:\Temp\" + ListBox1.Items(0) + ".pdf")
PictureBoxStatus1.Image = My.Resources.Green_Checkmark

所以从理论上讲,我需要能够在列表框中输入X数量的值并继续检查文件是否存在,如果存在,则更改所需的图像。

修改

这是我最终做的......虽然似乎工作得很好......

    ListBox1.Items.Add(TextBoxTicketID.Text)

    If CStr(ListBox1.Items(0)) = TextBoxTicketID.Text Then
        PictureBoxStatus1.Image = My.Resources.Orange_Information
    End If

    TextBoxTicketID.Text = ""
    Call CheckFiles()

添加了公共子

    Public Sub CheckSpooling()
    Dim Watcher As New FileSystemWatcher()
    Watcher.Path = "C:\Temp\"
    Watcher.Filter = ListBox1.Items(0) + ".pdf"

    AddHandler Watcher.Created, AddressOf OnChanged

    Watcher.EnableRaisingEvents = True
    End Sub

然后sub将运行添加文件所需的任何内容。我用msgbox进行测试。

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

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

用户在循环时无法输入任何内容的原因是因为WinForm框架本质上是单线程的。 UI中的所有内容都发生在同一个线程上,包括事件处理程序。因此,如果您在按钮单击事件处理程序中长时间处于循环中,则UI将被锁定并且无响应,直到代码退出循环。解决这个问题的方法是启动一个新线程来执行需要完成的任何工作。该工作线程可以在需要完成时使用,并且不会干扰UI线程,因此UI保持响应。 BackgroundWorker组件使您可以更轻松地将其放在表单设计器中的表单上。

但是,Dan-o推荐的FileSystemWatcher可能是比创建自己的工作线程更好的解决方案,该线程会一直检查文件是否存在。它不仅避免重新发明轮子,而且还会更有效率。它不是一直询问文件系统文件是否存在,而是只是监听来自文件系统的消息,以找出发生变化的时间。