folderbrowserdialog检查空间

时间:2013-04-05 16:18:24

标签: vb.net vb.net-2010 checklistbox checkeditems

我对VB很陌生,我正在试图弄清楚如何做一个特定的例程。我正在编写一个存档程序,其中包含一个清单,其中填充了某个驱动器上的所有目录。当用户检查目录时,它进入一个for循环,它抓取目录大小并在表单上显示它。但我遇到的问题是,一旦你开始选择超过4或5,它会越来越慢,因为它正在读取所有的checkitems并验证文件大小。有没有一种方法可以让我只选中最后一项检查或取消选中,这样我就可以添加/减去当前大小?这是我当前的代码循环遍历所有选中的项目。提前谢谢。

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

1 个答案:

答案 0 :(得分:0)

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

字典是一个存储密钥和值的集合(密钥是唯一的 - 因为你正在查看文件夹,这应该保持正常,我认为这是值得注意的)。在这种情况下,您的Key是文件夹名称,Value将是文件夹大小。

假设我有一个名为Form的{​​{1}}我可以这样声明我的词典:

Form1

请注意Imports System.Collections.Generic Public Class Form1 Dim fileSizesDict As Dictionary(Of String, Long) = New Dictionary(Of String, Long)() 的导入。

然后你的System.Collections.Generic处理程序就像:

SelectedIndexChanged

需要注意的事项:

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

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