You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用VB.NET在ListView中筛选目录下的重复文件

解决ListView显示同类型重复文件的问题

你当前的代码已经能正确获取指定类型文件的哈希并添加到ListView,但缺少筛选重复文件的核心逻辑。核心思路是:先把所有符合条件的文件按哈希值分组,只保留那些分组内文件数量≥2的(也就是存在重复的文件组),再将这些文件添加到ListView中。

下面是修改后的完整代码,我还优化了资源释放逻辑(用Using语句处理文件流和MD5实例),避免内存泄漏:

Public Function PrintByteArray(ByRef array() As Byte) As String
    Dim hex_value As String = ""
    Dim i As Integer
    For i = 0 To array.Length - 1
        hex_value += array(i).ToString("x2")
    Next i
    Return hex_value.ToLower()
End Function

Private Sub LoadDuplicateFiles()
    ' 清空ListView旧数据
    ListView1.Items.Clear()
    
    Dim SourceDir As New DirectoryInfo(TextBox1.Text)
    If Not SourceDir.Exists Then
        MessageBox.Show("指定目录不存在!")
        Return
    End If
    
    ' 统一处理选中的文件扩展名格式(确保带.)
    Dim targetExt As String = If(ComboBox1.SelectedItem.ToString().StartsWith("."), 
                                ComboBox1.SelectedItem.ToString().ToLower(), 
                                "." & ComboBox1.SelectedItem.ToString().ToLower())

    ' 1. 收集所有符合条件的文件及其哈希信息
    Dim fileInfos = SourceDir.GetFiles("*", SearchOption.AllDirectories)
                        .Where(Function(file) file.Extension.ToLower() = targetExt)
                        .Select(Function(file)
                                    Using md5 As MD5 = MD5.Create()
                                        Using fs As FileStream = file.OpenRead()
                                            Dim hashBytes = md5.ComputeHash(fs)
                                            Return New With {
                                                .FileName = Path.GetFileNameWithoutExtension(file.Name),
                                                .FileSize = file.Length / 1024,
                                                .Extension = file.Extension,
                                                .HashHex = PrintByteArray(hashBytes),
                                                .FullPath = file.FullName
                                            }
                                        End Using
                                    End Using
                                End Function)

    ' 2. 按哈希值分组,筛选出包含重复文件的组(分组数量>1)
    Dim duplicateGroups = fileInfos.GroupBy(Function(f) f.HashHex)
                                   .Where(Function(g) g.Count() > 1)

    ' 3. 将重复文件添加到ListView
    For Each group In duplicateGroups
        For Each file In group
            Dim NewItem As New ListViewItem(file.FileName)
            NewItem.SubItems.Add(file.FileSize.ToString("F2")) ' 保留两位小数显示文件大小
            NewItem.SubItems.Add(file.Extension)
            NewItem.SubItems.Add(file.HashHex)
            NewItem.SubItems.Add(file.FullPath)
            ListView1.Items.Add(NewItem)
        Next
    Next
End Sub

关键修改点说明:

  • 资源安全:用Using语句包裹MD5实例和FileStream,确保使用后自动释放资源,避免内存泄漏。
  • 分组筛选:通过GroupBy(Function(f) f.HashHex)把哈希相同的文件归为一组,再用Where(Function(g) g.Count() > 1)过滤出仅包含重复文件的组。
  • 用户体验:添加了目录存在性检查,避免空路径或无效目录导致的错误;文件大小保留两位小数,显示更友好。
  • 扩展名兼容:统一处理选中的扩展名格式,确保不管用户选的是.txt还是txt都能正确匹配目标文件。

你可以把原来的遍历代码替换成这个LoadDuplicateFiles方法,调用它就能只显示指定类型的重复文件了。

内容的提问来源于stack exchange,提问作者Jigar patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:07:52