比较列表视图中的2个目录 [英] Compare 2 directories in a listview
问题描述
我目前正在开展一个小项目。我试图比较文件夹和文件的两个目录。例如,如果我在我的c:\中有一个名为toto的文件夹,而在我的e:\中有另一个名为toto的文件夹,它将比较里面的文件。如果在里面我有toto.txt,toto1.txt,toto2.txt和其他文件夹我有toto.txt和toto1.txt,toto232.txt ...它会在我的listview中添加toto.txt和toto1.txt! :)但我使用递归程序:递归程序(Visual Basic) [ ^ ]我遇到了一些麻烦!继承人是我的全部职能:
私人 Sub comparerfichier( ByVal dir As 字符串, ByVal dir2 作为 字符串)
尝试
Dim directoire1 < span class =code-keyword> As New DirectoryInfo(dir)
Dim directoire2 作为 新 DirectoryInfo(dir2)
Dim fichierinfo1() As FileInfo = directoire1.GetFiles
Dim fichierinfo2( ) As FileInfo = directoire2.GetFiles
Dim dupNames =来自在 fichierinfo1加入b 在 fichierinfo2 开始 a.Name等于b.Name 选择 a.Name
listview的信息
使用 我 .ListView1
.View = View.Details
.GridLines = True
.FullRowSelect = True
.CheckBoxes = True
.Columns.Add( Fichiers, 150 ,HorizontalAlignment.Left)
.Columns.Add( DernièreModification, 120 ,HorizontalAlignment.Left )
结束 使用
' info sur l autre listview
使用 我 .ListView2
.View = View.Details
.GridLines = True
.FullRowSelect = True
.CheckBoxes = True
.Columns.Add( Fichiers, 150 ,HorizontalAlignment.Left)
.Columns.Add( DernièreModification, 120 ,HorizontalAlignment.Left)
结束 使用
' 在listview中添加相同的文件
对于 每个保留曲目作为 FileInfo 在 fichierinfo1
' 检查文件是相同的名称
对于 每个 repertoire2 作为 FileInfo 在 fichierinfo2
如果 repertoire.Name = repertoire2。姓名然后
Dim fichier As 新 ListViewItem(repertoire.Name)
Dim fichier2 作为 新 ListViewItem(repertoire2.Name)
' files1
使用 fichier
。 Name = repertoire.Name
.SubItems.Add(repertoire.LastWriteTime.ToString)
.Tag = repertoire
End 使用
' files1
使用 fichier2
.Name = repertoire2.Name
.SubItems.A dd(repertoire2.LastWriteTime.ToString)
.Tag = repertoire2
结束 使用
' 添加两个文件
我 .ListView1.Items.Add(fichier)
我 .ListView2.Items.Add(fichier2)
结束 如果
下一步
下一步
' ''' - 这些''''''' ''''
' 本部分的错误与复发程序
''' ''''''''''''''' '
Dim directoiresinfo() As DirectoryInfo = directoire1.GetDirectories
Dim directoires2info() As DirectoryInfo = directoire2.GetDirectories
Dim directoireGrosseur1() As String = IO.Directory.GetDirectories(dir)
Dim directoireGrosseur2() As String = IO.Directory.GetDirectories (dir2)
如果 directoireGrosseur1.Length<> 0 和 directoireGrosseur2.Length<> 0 然后
对于 < span class =code-keyword>每个 info 作为 IO.DirectoryInfo 在 directoiresinfo
对于 每个 info2 作为 IO .DirectoryInfo 在 directoires2info
如果 info.Name = info2.Name 然后
Dim 档案 As 新 ListViewItem(info.Name)
Dim dossier2 作为 新 ListViewItem(info2.Name)
使用档案
.Name = info.Name
.SubItems.Add(info.LastWriteTime.ToString)
.Tag = info
结束 使用
使用 dossier2
.Name = info2.Name
.SubItems.Add(info2.LastWriteTime.ToString)
.Tag = info2
End 使用
我 .ListView1.Items.Add(档案)
Me .ListView2.Items.Add(dossier2)
comparerfichier(info.GetDirectories.ToString,info2.GetDirectories.ToString)
< span class =code-keyword>结束 如果
下一步
下一步
结束 如果
''' ''''''''''' ''''
' 本部分的错误
< span class =code-summarycomment>''' '''''''''''''''''''''' '
<'$'$ b 对于 每个 pareil As < span class =code-keyword> String 在 dupNames
Dim itemA As ListViewItem = ListView1.Items(pareil)
Dim itemB 作为 ListViewItem = ListView2.Items(pareil)
Dim infoA As FileInfo = CType (itemA.Tag,FileInfo)
Dim infoB As FileInfo = CType (itemB.Tag,FileInfo)
如果 infoA.Length<> infoB.Length OrElse infoA.LastWriteTime<> infoB.LastWriteTime 然后
itemB.ForeColor = Color.Red
itemA.ForeColor = Color.Red
结束 如果
下一步
Catch ex As 异常
MessageBox.Show(ex.Message, Comparer2répertoires,MessageBoxButtons.OK,MessageBoxIcon.Information)
结束 尝试
结束 Sub
我的尝试:
所以是的,我的递归程序效果不好!我正在尝试调试它,但我还没找到任何东西!如果你们可以帮助我,我将非常感激!
我不明白你为什么要使用递归程序。.GetFiles
方法具有递归功能,因此它也可以从子文件夹中获取所有文件。
将listitems添加到每个listview的整个方法似乎也有点过于复杂。
这是列出两个文件夹中所有文件的示例,包括任何子文件夹。重复的文件名以蓝色突出显示,并且重复文件的大小或日期最后更新的位置不同,然后以红色突出显示。
您应该能够根据您的特定需求进行调整。
私有 Sub comparerfichier( ByVal dir 作为 字符串, ByVal dir2 作为 字符串)
尝试
Dim directoire1 作为 新 DirectoryInfo(dir)
Dim directoire2 作为 新 DirectoryInfo(dir2)
Dim fichierinfo1() As FileInfo = directoire1。 GetFiles( < span class =code-string> *。*,SearchOption.AllDirectories)
Dim fichierinfo2() As FileInfo = directoire2.GetFiles( *。*,SearchOption .AllDirectories)
' les fichiers en double
Dim dupNames =来自在 fichierinfo1加入b 在 fichierinfo2 开 a.Name等于b.Name 选择 a.Name
< span class =code-comment>' listview的信息
SetUpListView(ListView1)
' info sur l autre listview
SetUpListView(ListView2)
' 将文件添加到每个listview
FillListView(fichierinfo1,ListView1)
FillListView(fichierinfo2,ListView2)
' 突出显示重复项
对于 每个 pareil As 字符串 在 dupNames
Dim itemA < span class =code-keyword> As ListViewItem = ListView1.Items(pareil)
Dim itemB 作为 ListViewItem = ListView2.Items(pareil)
Dim infoA 作为 FileInfo = CType (itemA.Tag,FileInfo)
Dim infoB As FileInfo = CType (itemB .Tag,FileInfo)
如果 infoA.Length<> infoB.Length OrElse infoA.LastWriteTime<> infoB.LastWriteTime 然后
itemB.ForeColor = Color.Red
itemA.ForeColor = Color.Red
Else
itemA.ForeColor = Color.Blue
itemB.ForeColor = Color.Blue
End 如果
下一步
Catch ex As Exception
MessageBox.Show(ex.StackTrace,ex.Message,MessageBoxButtons.OK,MessageBoxIcon.Information)
结束 尝试
结束 Sub
私有 Sub SetUpListView(lv As ListView)
使用 lv
.View = View.Details
.GridLines = True
.FullRowSelect = True
.CheckBoxes = True
.Columns.Add(< span class =code-string> Fichiers, 150 ,HorizontalAlignment.Left )
.Columns.Add( 档案, 150 ,HorizontalAlignment.Left)
.Columns.Add( DernièreModification, 120 ,HorizontalAlignment.Left)
结束 使用
结束 Sub
私人 Sub FillListView(fichierinfo() As FileInfo,lv As ListView)
对于 每个保留曲目作为 FileInfo 在 fichierinfo
Dim fichier 作为 新 ListViewItem(repertoire.Name)
使用 fichier
.Name = repertoire.Name
.SubItems.Add(repertoire.DirectoryName)
.SubItems.Add(repertoire.LastWriteTime.ToString)
.Tag = repertoire
< span class =code-keyword>结束 使用
lv.Items.Add(fichier)
下一步
结束 子跨度>
I'm currently working on a small project. I am trying to compare two directories for the folders and the files. For example, if i have a folders named toto in my c:\ and a other one named toto in my e:\ it will compare the files inside. If inside i have toto.txt, toto1.txt, toto2.txt and in the other folders i have toto.txt and toto1.txt, toto232.txt... it will add toto.txt and toto1.txt in my listview! :) but im using the recursive procedures : Recursive Procedures (Visual Basic)[^] and i have some trouble with it! heres is my complete function :
Private Sub comparerfichier(ByVal dir As String, ByVal dir2 As String)
Try
Dim directoire1 As New DirectoryInfo(dir)
Dim directoire2 As New DirectoryInfo(dir2)
Dim fichierinfo1() As FileInfo = directoire1.GetFiles
Dim fichierinfo2() As FileInfo = directoire2.GetFiles
Dim dupNames = From a In fichierinfo1 Join b In fichierinfo2 On a.Name Equals b.Name Select a.Name
' info for the listview
With Me.ListView1
.View = View.Details
.GridLines = True
.FullRowSelect = True
.CheckBoxes = True
.Columns.Add("Fichiers", 150, HorizontalAlignment.Left)
.Columns.Add("Dernière Modification", 120, HorizontalAlignment.Left)
End With
' info sur l autre listview
With Me.ListView2
.View = View.Details
.GridLines = True
.FullRowSelect = True
.CheckBoxes = True
.Columns.Add("Fichiers", 150, HorizontalAlignment.Left)
.Columns.Add("Dernière Modification", 120, HorizontalAlignment.Left)
End With
'add the same files in the listview
For Each repertoire As FileInfo In fichierinfo1
'check if the files is the same name
For Each repertoire2 As FileInfo In fichierinfo2
If repertoire.Name = repertoire2.Name Then
Dim fichier As New ListViewItem(repertoire.Name)
Dim fichier2 As New ListViewItem(repertoire2.Name)
'files1
With fichier
.Name = repertoire.Name
.SubItems.Add(repertoire.LastWriteTime.ToString)
.Tag = repertoire
End With
'files1
With fichier2
.Name = repertoire2.Name
.SubItems.Add(repertoire2.LastWriteTime.ToString)
.Tag = repertoire2
End With
'add both files
Me.ListView1.Items.Add(fichier)
Me.ListView2.Items.Add(fichier2)
End If
Next
Next
' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ERROR IN THIS PART with THE RECURSIVE PROCEDURE
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim directoiresinfo() As DirectoryInfo = directoire1.GetDirectories
Dim directoires2info() As DirectoryInfo = directoire2.GetDirectories
Dim directoireGrosseur1() As String = IO.Directory.GetDirectories(dir)
Dim directoireGrosseur2() As String = IO.Directory.GetDirectories(dir2)
If directoireGrosseur1.Length <> 0 And directoireGrosseur2.Length <> 0 Then
For Each info As IO.DirectoryInfo In directoiresinfo
For Each info2 As IO.DirectoryInfo In directoires2info
If info.Name = info2.Name Then
Dim dossier As New ListViewItem(info.Name)
Dim dossier2 As New ListViewItem(info2.Name)
With dossier
.Name = info.Name
.SubItems.Add(info.LastWriteTime.ToString)
.Tag = info
End With
With dossier2
.Name = info2.Name
.SubItems.Add(info2.LastWriteTime.ToString)
.Tag = info2
End With
Me.ListView1.Items.Add(dossier)
Me.ListView2.Items.Add(dossier2)
comparerfichier(info.GetDirectories.ToString, info2.GetDirectories.ToString)
End If
Next
Next
End If
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ERROR IN THIS PART
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
For Each pareil As String In dupNames
Dim itemA As ListViewItem = ListView1.Items(pareil)
Dim itemB As ListViewItem = ListView2.Items(pareil)
Dim infoA As FileInfo = CType(itemA.Tag, FileInfo)
Dim infoB As FileInfo = CType(itemB.Tag, FileInfo)
If infoA.Length <> infoB.Length OrElse infoA.LastWriteTime <> infoB.LastWriteTime Then
itemB.ForeColor = Color.Red
itemA.ForeColor = Color.Red
End If
Next
Catch ex As Exception
MessageBox.Show(ex.Message, "Comparer 2 répertoires", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End Sub
What I have tried:
so yeah, my recursive procedures doesn't work great! I'm trying to debug it but I'm not found anything yet! If you guys can help me it would be very appreciated!
I don't understand why you are using a recursive procedure at all. The.GetFiles
method has a recursive feature so that it will get all of the files from the sub-folders too.
Your whole method of adding the listitems to each listview seems a little overcomplicated too.
Here is an example of listing all of the files in two folders, including any sub-folders. Duplicate filenames are highlighted in blue and where the duplicated files differ in size or date last updated then they are highlighted in red.
You should be able to adapt this to your specific needs.
Private Sub comparerfichier(ByVal dir As String, ByVal dir2 As String) Try Dim directoire1 As New DirectoryInfo(dir) Dim directoire2 As New DirectoryInfo(dir2) Dim fichierinfo1() As FileInfo = directoire1.GetFiles("*.*", SearchOption.AllDirectories) Dim fichierinfo2() As FileInfo = directoire2.GetFiles("*.*", SearchOption.AllDirectories) 'les fichiers en double Dim dupNames = From a In fichierinfo1 Join b In fichierinfo2 On a.Name Equals b.Name Select a.Name ' info for the listview SetUpListView(ListView1) ' info sur l autre listview SetUpListView(ListView2) 'add the files to each listview FillListView(fichierinfo1, ListView1) FillListView(fichierinfo2, ListView2) 'highlight the duplicates For Each pareil As String In dupNames Dim itemA As ListViewItem = ListView1.Items(pareil) Dim itemB As ListViewItem = ListView2.Items(pareil) Dim infoA As FileInfo = CType(itemA.Tag, FileInfo) Dim infoB As FileInfo = CType(itemB.Tag, FileInfo) If infoA.Length <> infoB.Length OrElse infoA.LastWriteTime <> infoB.LastWriteTime Then itemB.ForeColor = Color.Red itemA.ForeColor = Color.Red Else itemA.ForeColor = Color.Blue itemB.ForeColor = Color.Blue End If Next Catch ex As Exception MessageBox.Show(ex.StackTrace, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Information) End Try End Sub Private Sub SetUpListView(lv As ListView) With lv .View = View.Details .GridLines = True .FullRowSelect = True .CheckBoxes = True .Columns.Add("Fichiers", 150, HorizontalAlignment.Left) .Columns.Add("Dossier", 150, HorizontalAlignment.Left) .Columns.Add("Dernière Modification", 120, HorizontalAlignment.Left) End With End Sub Private Sub FillListView(fichierinfo() As FileInfo, lv As ListView) For Each repertoire As FileInfo In fichierinfo Dim fichier As New ListViewItem(repertoire.Name) With fichier .Name = repertoire.Name .SubItems.Add(repertoire.DirectoryName) .SubItems.Add(repertoire.LastWriteTime.ToString) .Tag = repertoire End With lv.Items.Add(fichier) Next End Sub
这篇关于比较列表视图中的2个目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!