2013-04-05 3 views
0

나는 VB에서 약간 익숙해 어떤 루틴을 어떻게 할 수 있는지 알아 내려고 노력 중이다. 특정 드라이브의 모든 디렉토리로 채워진 checklistbox가있는 아카이브 프로그램을 작성 중입니다. 사용자가 디렉토리를 확인하면 디렉토리 크기를 가져 와서 양식에 표시하는 for 루프로 이동합니다. 그러나 내가 가지고있는 이슈는 4 또는 5 이상을 선택하면 모든 검사 항목을 통해 읽고 파일 크기를 확인하므로 속도가 느려지고 느려집니다. 최근 아이템을 체크하거나 체크하지 않아서 현재 사이즈에서 덧셈/뺄셈을 할 수있는 방법이 있습니까? 이 내 현재 코드는 모든 체크 된 항목을 반복합니다. 미리 감사드립니다. 다시 크기를 계산하지 않아도folderbrowserdialog Check Space

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를 사용할 수 있습니다.

사전은 키와 값을 저장하는 모음입니다 (키가 고유 한 키로 -이 키는 확인해야하는 폴더를보고 있기 때문에 인식하고 있어야합니다). 이 경우 Key는 폴더 이름이고 Value는 폴더 크기입니다.

나는 Form 내가 그렇게처럼 내 사전을 선언 할 수 있습니다 Form1라는이 가정 : System.Collections.Generic

Imports System.Collections.Generic 

Public Class Form1 
    Dim fileSizesDict As Dictionary(Of String, Long) = New Dictionary(Of String, Long)() 

주 수입.

그리고 당신의 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. , 우리는 내가 특정 사용 케이스되지 확신하지만 .... 크기를 계산 한 후 나는 For 루프 외부 lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes."를 이동 한 Add 방법
  5. 를 통해 향후 사용을 위해 사전에 저장이 경우 라벨은 최종 계산 결과로 업데이트됩니다. 주의 할이

:-)하지만 들어온다이 변경 필요 : 사람이 디렉토리 (일부 파일 또는 제거)에 더 많은 파일을 추가 한 경우주의해야한다는 점에서이 방법 여기 있습니다 어떤 이전에 크기가 계산 된 경우 다시 계산되지 않으므로 크기 변경을 선택하지 않습니다 ...이 경우 사용 사례에 큰 영향을 줄지는 모르겠지만 주목할만한 가치가 있습니다.

+0

대단히 감사합니다. 과거에는 사전을 사용했지만 사전에는 사전을 사용하지 않았습니다. – user2202347