2013-04-05 9 views
0

Я довольно новичок в VB, и я пытаюсь выяснить, как я могу сделать определенную рутину. Я пишу программу архива, у которой есть контрольный список, заполненный всеми каталогами на определенном диске. Когда пользователь проверяет каталоги, он переходит в цикл 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 для хранения ранее записанных каталогов и их размеры, так что вам не нужно вычислять размеры снова.

Словарь - это коллекция, в которой хранится ключ и значение (с уникальным ключом - поскольку вы смотрите на папки, это должно задержать ОК, я думаю, но это то, о чем нужно знать). В этом случае ваш ключ - это имя папки, а значение будет размером папки.

Предполагая, что у меня есть Form называется 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 

Пара вещей, чтобы отметить:

  1. Первое, что мы делаем поиск словаря, чтобы увидеть, если мы уже вычислили размер папки с помощью метода ContainsKey
  2. Если размер папки был ранее рассчитан, мы просто получаем содержимое из Словаря
  3. В противном случае, мы вычисляем размер, а затем сохранить его в словарь для будущего использования через Add метод
  4. я переехал lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes." вне цикла For .... Я не уверен в вашем конкретном случае использования, но в этом случае Ярлык будет обновлен только с окончательными результатами расчета; нарезать и изменить при необходимости, хотя :-)

Caveat: Существует один нюанс здесь, в этом подходе в том, что если кто-то добавил несколько файлов (или удалить некоторые файлы из) каталога, который ранее был рассчитан его размер, мы не собираемся менять размер, поскольку он не пересчитывается ... Я не уверен, что это окажет существенное влияние на ваш случай использования или нет, а на что-то заслуживающее внимания.

+0

спасибо. Я использовал словарь в прошлом, но никогда не думал об использовании словаря для этого. – user2202347

 Смежные вопросы

  • Нет связанных вопросов^_^