我在VB.NET程序中有一个非常简单的代码,用于加载文本框中文件夹中的所有路径。代码效果很好,问题是它实时添加了行,因此在界面逐行显示时加载20k文件大约需要3分钟。
这是我的代码:
Dim ImageryDB As String() = IO.Directory.GetFiles("c:\myimages\")
For Each image In ImageryDB
txtbAllimg.AppendText(image & vbCrLf)
Next
如何强制我的程序以块的形式加载文件或每秒更新一次界面?
提前致谢
答案 0 :(得分:0)
是的,你可以这样做。您需要将文件名加载到某种类型的屏幕外数据结构中,而不是将它们直接加载到控件中。然后,您可以定期更新控件以显示到目前为止加载的内容。但是,我认为你会发现缓慢来自仅来更新控件。一旦删除该部分,就不需要在加载过程中定期更新控件,因为它几乎是瞬时的。
您可以将所有文件名加载到一个字符串中,然后只在文本框完全加载后将其设置为该字符串,如下所示:
Dim imagePaths As String = ""
For Each image As String In Directory.GetFiles("c:\myimages\")
imagePaths &= image & Environment.NewLine
Next
txtbAllimg.Text = imagePaths
但是,这不如使用StringBuilder
:
Dim imagePaths As New StringBuilder()
For Each image As String In Directory.GetFiles("c:\myimages\")
imagePaths.AppendLine(image)
Next
txtbAllimg.Text = imagePaths.ToString()
但是,由于GetFiles
方法已经将完整的路径列表作为字符串数组返回给您,因此使用String.Join
会更方便(也可能更高效)将数组中的所有项组合成单个字符串的方法:
txtbAllimg.Text = String.Join(Environment.NewLine, Directory.GetFiles("c:\myimages\"))
答案 1 :(得分:0)
我知道这不是你实际问题的答案,但是AppendText很慢。使用ListBox并向其添加项目是约。快3倍。 ListBox还具有能够轻松选择项目(至少比TextBox更容易)
的好处For each image in ImageryDB
Me.ListBox1.Items.add (image)
Next
然而,可能有一种更有用,更快捷的方法。使用FileInfo。
Dim dir As New IO.DirectoryInfo("C:\myImages")
Dim fileInfoArray As IO.FileInfo() = dir.GetFiles()
Dim fileInfo As IO.FileInfo
For Each fileInfo In fileInfoArray
Me.ListBox2.Items.Add(fileInfo.Name)
Next