2013-04-05 39 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