比较列表视图中的2个目录 [英] Compare 2 directories in a listview

查看:71
本文介绍了比较列表视图中的2个目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开展一个小项目。我试图比较文件夹和文件的两个目录。例如,如果我在我的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 ,Horizo​​ntalAlignment.Left)
.Columns.Add( DernièreModification 120 ,Horizo​​ntalAlignment.Left )
结束 使用
' info sur l autre listview
使用 .ListView2
.View = View.Details
.GridLines = True
.FullRowSelect = True
.CheckBoxes = True
.Columns.Add( Fichiers 150 ,Horizo​​ntalAlignment.Left)
.Columns.Add( DernièreModification 120 ,Horizo​​ntalAlignment.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 ,Horizo​​ntalAlignment.Left )
.Columns.Add( 档案 150 ,Horizo​​ntalAlignment.Left)
.Columns.Add( DernièreModification 120 ,Horizo​​ntalAlignment.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆