0

我对 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
4

1 回答 1

0

您可能可以使用字典来存储以前记录的目录及其大小,这样您就不必再次计算大小。

Dictionary 是一个存储键和值的集合(键是唯一的 - 因为您正在查看文件夹,所以我认为这应该可以保持,但这是需要注意的事情)。在这种情况下,您的 Key 是文件夹名称,Value 是文件夹大小。

假设我有一个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. 我们做的第一件事是搜索 Dictionary 看看我们是否已经通过使用ContainsKey方法计算了文件夹的大小
  2. 如果之前已经计算过文件夹大小,那么我们只需从 Dictionary 中获取内容
  3. 否则,我们计算大小,然后通过该Add方法将其存储在 Dictionary 中以供将来使用
  4. 我移到lblWorkspaceSize.Text = chklstbxWorkspace.CheckedIndices.Count.ToString & " folders selected. " & Format(fsize, "###,###,###,###,##0") & " bytes."For循环之外……我不确定您的具体用例,但在这种情况下,标签只会使用最终计算结果进行更新;切碎并根据需要进行更改:-)

警告:这种方法有一个警告,如果有人向之前计算过其大小的目录添加了更多文件(或从中删除了一些文件),那么我们将不会选择大小更改,因为它不会重新计算...我不确定这是否会对您的用例产生重大影响,但这只是值得注意的事情。

于 2013-04-05T17:08:40.163 回答