Member 12754823 Ответов: 1

Сравните 2 каталога в listview


Сейчас я работаю над небольшим проектом. Я пытаюсь сравнить два каталога для папок и файлов. Например, если у меня есть папка с именем toto в моем c:\ и другая с именем toto в моем e:\, она будет сравнивать файлы внутри. Если внутри у меня есть toto.txt, toto1.txt, toto2.txt а в других папках у меня есть toto.txt и toto1.txt, toto232.txt... это добавит toto.txt и toto1.txt в моем списке! :) но я использую рекурсивные процедуры : Рекурсивные Процедуры (Visual Basic)[^] и у меня есть некоторые проблемы с этим! вот моя полная функция :

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


Что я уже пробовал:

так что да, мои рекурсивные процедуры работают не очень хорошо! Я пытаюсь его отладить, но пока ничего не нашел! Если вы, ребята, можете мне помочь, это будет очень ценно!

NotPolitcallyCorrect

"Ошибка в этой части" ничего не говорит нам о вашей проблеме.

Wendelius

В чем вся проблема? Если вы получили сообщение об ошибке, опубликуйте полное сообщение или полное описание проблемы.

1 Ответов

Рейтинг:
1

CHill60

Я вообще не понимаю, почему вы используете рекурсивную процедуру. То .GetFiles метод имеет рекурсивную функцию, так что он будет получать все файлы из подпапок тоже.

Весь ваш способ добавления элементов listitem для каждого элемента управления ListView, кажется, тоже немного перемудрили.

Вот пример перечисления всех файлов в двух папках, включая любые подпапки. Дубликаты имен файлов выделяются синим цветом, а если дубликаты файлов отличаются по размеру или дате последнего обновления, то они выделяются красным.

Вы должны быть в состоянии адаптировать это к вашим конкретным потребностям.

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


Member 12754823

Спасибо, что это работает! ты потрясающая!

CHill60

Спасибо ... скорее любопытно, чем потрясающе, я думаю ... изучите те варианты, которые предлагает intellisense ... Я и сам так многому научился :-)