папкабраузердиалог Проверить пробел

Я довольно новичок в VB, и я пытаюсь понять, как я могу выполнять определенную процедуру. Я пишу архивную программу, в которой есть контрольный список, заполненный всеми каталогами на определенном диске. Когда пользователь проверяет каталоги, он входит в цикл for, который захватывает размер каталога и показывает его в форме. Но проблема, с которой я сталкиваюсь, заключается в том, что, как только вы начинаете выбирать более 4 или 5, он становится все медленнее и медленнее, поскольку он считывает все проверенные элементы и проверяет размер файла с помощью. Есть ли способ просто взять последний отмеченный или не отмеченный элемент, чтобы я мог просто добавить/вычесть из текущего размера? Это мой текущий код, перебирающий все отмеченные элементы. Заранее спасибо.

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

person user2202347    schedule 05.04.2013    source источник


Ответы (1)


Вероятно, вы могли бы использовать Словарь для хранения ранее записанных каталогов и их размеров, чтобы Вам не нужно снова рассчитывать размеры.

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

Предполагая, что у меня есть 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.... Я не уверен в вашем конкретном случае использования, но в этом случае метка будет просто обновлена ​​​​с окончательными результатами расчета; нарезать и изменить это по мере необходимости :-)

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

person nkvu    schedule 05.04.2013
comment
Большое тебе спасибо. Я использовал словарь в прошлом, но никогда не думал об использовании словаря для этого. - person user2202347; 05.04.2013