我对VB很陌生,我正在试图弄清楚如何做一个特定的例程。我正在编写一个存档程序,其中包含一个清单,其中填充了某个驱动器上的所有目录。当用户检查目录时,它进入一个for循环,它抓取目录大小并在表单上显示它。但我遇到的问题是,一旦你开始选择超过4或5,它会越来越慢,因为它正在读取所有的checkitems并验证文件大小。有没有一种方法可以让我只选中最后一项检查或取消选中,这样我就可以添加/减去当前大小?这是我当前的代码循环遍历所有选中的项目。提前谢谢。
Dim fsize As Long = 0
Private Sub chklstbxWorkspace_SelectedIndexChanged(sender As Object, e As EventArgs) Handles chklstbxWorkspace.SelectedIndexChanged
Dim entry As Object
If chklstbxWorkspace.CheckedIndices.Count > 0 Then
btnStartArchive.Enabled = True
Else
btnStartArchive.Enabled = False
End If
lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected."
For Each entry In chklstbxWorkspace.CheckedItems
fsize += DirectorySize("w:\" & entry.ToString, True)
lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes."
Next
Application.DoEvents()
End Sub
答案 0 :(得分:0)
您可以使用Dictionary来存储以前记录的目录及其大小,这样您就不必再次计算大小了。
字典是一个存储密钥和值的集合(密钥是唯一的 - 因为你正在查看文件夹,这应该保持正常,我认为这是值得注意的)。在这种情况下,您的Key是文件夹名称,Value将是文件夹大小。
假设我有一个名为Form
的{{1}}我可以这样声明我的词典:
Form1
请注意Imports System.Collections.Generic
Public Class Form1
Dim fileSizesDict As Dictionary(Of String, Long) = New Dictionary(Of String, Long)()
的导入。
然后你的System.Collections.Generic
处理程序就像:
SelectedIndexChanged
需要注意的事项:
Private Sub chklstbxWorkspace_SelectedIndexChanged(sender As Object, e As EventArgs) Handles chklstbxWorkspace.SelectedIndexChanged
Dim fsize As Long = 0
Dim entry As Object
If chklstbxWorkspace.CheckedIndices.Count > 0 Then
btnStartArchive.Enabled = True
Else
btnStartArchive.Enabled = False
End If
lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected."
For Each entry In chklstbxWorkspace.CheckedItems
If fileSizesDict.ContainsKey(entry.ToString()) Then
fsize += fileSizesDict(entry.ToString())
Else
Dim directorySize As Long = directorySize("w:\" & entry.ToString, True)
fsize += directorySize
fileSizesDict.Add(entry.ToString(), directorySize)
End If
Next
lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes."
End Sub
方法计算了文件夹的大小ContainsKey
方法Add
移到lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes."
循环之外....我不确定您的具体用例,但在这种情况下,Label将仅使用最终的计算结果进行更新;切断并根据需要改变它: - )警告:在这种方法中有一个警告,如果有人向以前计算过其大小的目录中添加了更多文件(或从中删除了一些文件),那么我们就不会接收尺寸变化,因为它没有重新计算......我不确定这是否会对您的用例产生重大影响,但只是值得注意的事情。