2013-04-05 42 views
0

我对VB非常陌生,我想弄清楚我该如何做一些特定的例程。我正在编写一个归档程序,该程序的某个驱动器上的所有目录都有一个清单框。当用户检查目录时,它会进入for循环,获取目录大小并将其显示在表单上。但是我遇到的问题是,一旦你开始选择超过4或5,它会越来越慢,因为它正在读取所有checkeditems并使用它来验证文件大小。有没有一种方法可以让我抓住最后一项选中或取消选中,这样我就可以从当前的大小加上/减去?这是我目前的代码循环所有检查的项目。先谢谢你。folderbrowserdialog检查空间

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

你也许可以用一个Dictionary存储先前记录的目录和它们的大小,这样你就不必再计算大小。

的解释是存储键和值的集合(键为独一无二的 - 因为你正在寻找的文件夹这应该托起OK,我想,但它是一个需要注意的)。在这种情况下,您的密钥是文件夹名称,值将是文件夹大小。

假设我有一个名为FormForm1可以宣布我的字典,像这样:

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 

几件事情需要注意:

  1. 我们做的第一件事就是搜索字典,看看是否我们已经计算出通过使用ContainsKey方法
  2. 如果该文件夹的大小已预先进行计算,然后,我们刚刚从字典
  3. 获得内容的文件夹的大小
  4. 否则,我们计算出的大小,然后通过Add方法
  5. 我感动lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes."For循环外供将来使用存储在字典....我不知道你的具体使用情况,但在这种情况下,标签将随着最终的计算结果而更新;朝令夕改此需要,虽然:-)

买者:有一个警告这里的这种做法,如果有人添加多个文件(或删除一些文件)的目录,其之前已经计算过它的大小,那么我们不会重新计算大小的变化,因为它不会被重新计算......我不确定这是否会对您的用例产生重大影响,但只是一些值得注意的事情。

+0

非常感谢。过去我使用过字典,但从未考虑过使用字典。 – user2202347 2013-04-05 18:28:30