【问题标题】:folderbrowserdialog Check Space文件夹浏览器对话框检查空间
【发布时间】:2013-04-05 16:18:23
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    假设我有一个名为 Form1Form 我可以像这样声明我的字典:

    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 循环之外....我不确定您的具体用例,但在这种情况下,标签只会使用最终计算结果进行更新;不过根据需要砍掉并更改它:-)

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

    【讨论】:

    • 非常感谢。我过去使用过字典,但从未想过为此使用字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2012-10-29
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多