C# Visual Basic: 2 Verzeichnisse miteinander vergleichen

TresPuntos

Cadet 4th Year
Registriert
Juni 2018
Beiträge
113
Hallo,

als kleinerer Anfänger im Bereich C# versuche ich mich an einer App.
Ich habe 2 Verzeichnisse C:\Beispiel\Pfad1 und C:\Beispiel\Pfad2, hierbei sind gleich benannte Dokumente Bsp:
C:\Beispiel\Pfad1\Test.txt und C:\Beispiel\Pfad2\Test.txt mit ihren Unterordner (wo die Verzeichnisstruktur komplett gleich ist.
Das Programm soll nun beide Verzeichnisse durchlaufen und gleichnamige Dateien auf seine größe Vergleichen, sprich wenn Sie gleich sind soll das Element von C:\Beispiel\Pfad1\Test.txt in der Listbox markiert werden. Falls sie unterschiedlich groß sind, sollte einfach ein continue zum nächsten laufen. Aus Pfad1 gibt es weniger Dateien, die aber den gleichen Namen in Pfad2 besitzen.
 
Ich lasse mir bereits den Pfad1 auslesen mit:
public void ListeFuellen()
{
listBox1.Items.Clear();
foreach (var fn in Directory.GetFiles(@"C:\Beispiel\Pfad1", "*.*", SearchOption.AllDirectories))
{
listBox1.Items.Add(fn);
}
label1.Text = "Liste wurde erfolgreich gefüllt";
}
ausgegeben wird hier allerdings das ganze Verzeichnis, mir wäre hier lieber, dass es nur alles nach C:\Beispiel\Pfad1 ausgibt. Damit wäre meine Frage oben leichter zu bewältigen.
Ergänzung ()

Bzw. fehlt mir der Ansatz, wie ich die gleichnamigen Dateien aus unterschiedlichen Pfaden miteinander vergleichen kann.
 
Du willst die Listbox zum vergleichen nutzen das dürfte dein erstes Problem sein. Die Listbox sollte nur zum Anzeigen dienen intern verarbeitet man die Daten aber richtig.
Mein C# ist eingerostet aber ich würde Array oder String Listen nutzen und die Funktion Directory.GetFiles ohne Suchmuster verwenden. Die Listen Arrays dann vergleichen je nachdem für was du dich dann entschieden hast.
Hilft dir eventuell für einen Denkanstoß.
 
Ja das ist mir bewusst, in der Listbox1 sollten dann lediglich diejenigen Dateien markiert werden die gleich groß sind.
Mein Gedanke war jetzt 2 Listen zu generieren in denen die Verzeichnisstruktur nach C:\Beispiel\Pfad1 bzw ...Pfad2, sodass man als Ausgabe zwei gleichnamige Listelemente hat. Im Anschluss soll durch eine Schleife auf beide Elemente gestoßen werden. Danach soll beim Vergleich beiden die Verzeichnisstruktur C:\Beispiel\Pfad1 bzw ...Pfad2 beim Größenvergleich übergeben werden, damit die interne Verarbeitung richtig verläuft, wie du es erwähnt hattest (Phneom). Ist der Grundgedanke richtig bzw habe ich das verständlich erklärt?
Und danke für die bisherige Hilfe
 
Schnell überlegt könnte man das so machen, möglicherweise kann man sich sogar eine Liste sparen.
Sprich eine Liste einlesen für den ersten Pfad und eine zur Ausgabe.
Eine Liste einlesen mit foreach(erster Pfad), mit der anderen foreach eben Datei für Datei vergleichen(zweiter Pfad) und das Ergebnis in die fertig liste + in die listbox schieben. Die Größe sollte man denke ich mit GetFileInfo erhalten, ob .length korrekt ist müsstest du mal ausprobieren.
 
Du willst ja nur eine Liste mit gleich großen Elementen (können ja verschieden sein, ist aber nicht schlimm nach deiner Anforderung). Dann müssen alle Elemente in Ordner 1 UND 2 sein.

Schritt 1: Liste mit allen Elementen aus Ordner 1 erzeugen.
Schritt 2: Für jedes Listenelement folgendes tun:
Schritt 2.1: Prüfen, ob in Ordner 2 vorhanden. Falls nein, aus der Liste löschen
Schritt 2.2: Prüfen, ob Elemente aus Ordner 1 und 2 gleich groß sind. Falls nein, aus der Liste löschen.

Am Ende erhältst du eine Liste, die alle Elemente enthält, die sowohl in Ordner 1 als auch Ordner 2 sind, und die die gleiche Größe haben.
 
C#:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var commonFiles = GetCommonFiles(@"c:\temp2\", @"c:\temp3");
            var commonFilesWithDifferrentFileSize = commonFiles.Where(p => (new FileInfo(p.FilePath1)).Length != (new FileInfo(p.FilePath2)).Length);
           foreach ( var fileMatch in    commonFilesWithDifferrentFileSize)
            {
                Console.WriteLine(fileMatch.FilePath1 +" " +fileMatch.FilePath2);
            }
            Console.ReadKey();
        }

        static IEnumerable<FileMatch> GetCommonFiles(string directory1, string directory2)
        {
            if (directory1[directory1.Length - 1] != Path.DirectorySeparatorChar) directory1 += Path.DirectorySeparatorChar;
            if (directory2[directory2.Length - 1] != Path.DirectorySeparatorChar) directory2 += Path.DirectorySeparatorChar;
            var files1= Directory.GetFiles(directory1, "*.*", SearchOption.AllDirectories).Select(p=>p.Substring(directory1.Length));
            var files2= Directory.GetFiles(directory2, "*.*", SearchOption.AllDirectories).Select(p=>p.Substring(directory2.Length));
            var commonFiles = files1.Intersect(files2);

            return commonFiles.Select(p => new FileMatch() { FilePath1 = directory1 + p, FilePath2 = directory2 + p });
                

        }
        public class FileMatch
        {
            public string FilePath1 { get; set; }
            public string FilePath2 { get; set; }

        }

    
    }
}

Mal als Denkansatz...
Kannst auch schauen ob es für genau diesen Zweck nicht schon ne Library gibt. Ordnervergleich geht unter Linux mit dem Kommando diff, vlt. findest du was passendes.
 

Ähnliche Themen

Zurück
Oben