如何使用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
相关产品推荐
相关产品推荐

