none
Dateien vergleichen RRS feed

  • Frage

  • Hallo,

    wie kann ich feststellen ob in 2 ordner die gleichen dateien enthalten sind.

    Es müsste eine anzeige erfolgen "in einer Richbox oder wo anderst" in der ich ersehe welche Datei in welchem Ordner fehlt.

    Ordner mit Unterordner sind vorhanden.

    danke

    Cay


    • Bearbeitet c_joksch Montag, 14. Januar 2013 14:02
    Montag, 14. Januar 2013 13:58

Antworten

  • Hallo Cay,

    wenn es nur um die Namen geht, reicht ein Intersect (bzw. Except):

            private void DateiNamenVergleich()
            {
                const string Verzeichnis = @"C:\TEMP";
                const string VergleichsVerzeichnis = @"C:\TEMP\Vergleich";
    
                string[] Dateien = new DirectoryInfo(Verzeichnis)
                    .GetFiles().Select(f => f.Name).ToArray();
                string[] VergleichsDateien = new DirectoryInfo(VergleichsVerzeichnis)
                    .GetFiles().Select(f => f.Name).ToArray();
    
                string[] GemeinsameDateien = Dateien.Intersect(VergleichsDateien).ToArray();
                string[] FehlendeDateien = Dateien.Except(VergleichsDateien).ToArray();
                string[] NeueDateien = VergleichsDateien.Except(Dateien).ToArray();
    
                Console.WriteLine("Gemeinsame {0}, Fehlende {1}, Neue {2} Dateien",
                    GemeinsameDateien.Length, FehlendeDateien.Length, NeueDateien.Length);
            }
    
    

    "Gleichheit" wäre dann gegeben, wenn Dateien wie GemeinsameDateien die gleiche Anzahl enthalten. Abweichungen siehe die anderen beiden.

    Äquivalent ginge es weiter, wenn man die Größe, Inhalte ... vergleichen wollte.

    Gruß Elmar

    • Als Antwort vorgeschlagen Jürgen Röhr Montag, 14. Januar 2013 17:43
    • Als Antwort markiert c_joksch Dienstag, 15. Januar 2013 10:23
    Montag, 14. Januar 2013 16:01
    Beantworter

Alle Antworten

  • Definiere "gleiche Datei". Im Grunde musst du für alle betroffenen Dateien ein Fingerprint (SHA) erstellen und diese vergleichen.
    Montag, 14. Januar 2013 14:12
  • Hi,

    ich habe 2 Ordner 1 Master und 1 der sich ändert.

    Nun möchte ich nachschauen ob in dem geändertem Ordner alle Dateien drinn sind die im Master sind oder ob sogar zuviele in dem geändertem drinnen sind.

    grüße

    cay

    Montag, 14. Januar 2013 14:20
  • Deine Fragestellung beinhaltet zwei Punkte:

    1. Eine Verzeichnisübersicht bekommst du mit Directory.GetFiles().
    2. Dateien sind dann identisch, wenn sie Byte für Byte übereinstimmen. Daher musst die sie auf dieser Ebene vergleichen. Das geht mit oben erwähnten Fingerprints ausreichend zuverlässig.

    Die Frage ist, was möchtest du genau davon wie anzeigen?

    Montag, 14. Januar 2013 15:29
  • Hi,

    die größe oder was anderes ist mir egal.

    Ich möchte nur wissen ob alle, zuviel oder zuwenig Dateien in dem geändertem Ordner vorhanden sind.

    danke

    Cay

    Montag, 14. Januar 2013 15:37
  • Hallo Cay,

    wenn es nur um die Namen geht, reicht ein Intersect (bzw. Except):

            private void DateiNamenVergleich()
            {
                const string Verzeichnis = @"C:\TEMP";
                const string VergleichsVerzeichnis = @"C:\TEMP\Vergleich";
    
                string[] Dateien = new DirectoryInfo(Verzeichnis)
                    .GetFiles().Select(f => f.Name).ToArray();
                string[] VergleichsDateien = new DirectoryInfo(VergleichsVerzeichnis)
                    .GetFiles().Select(f => f.Name).ToArray();
    
                string[] GemeinsameDateien = Dateien.Intersect(VergleichsDateien).ToArray();
                string[] FehlendeDateien = Dateien.Except(VergleichsDateien).ToArray();
                string[] NeueDateien = VergleichsDateien.Except(Dateien).ToArray();
    
                Console.WriteLine("Gemeinsame {0}, Fehlende {1}, Neue {2} Dateien",
                    GemeinsameDateien.Length, FehlendeDateien.Length, NeueDateien.Length);
            }
    
    

    "Gleichheit" wäre dann gegeben, wenn Dateien wie GemeinsameDateien die gleiche Anzahl enthalten. Abweichungen siehe die anderen beiden.

    Äquivalent ginge es weiter, wenn man die Größe, Inhalte ... vergleichen wollte.

    Gruß Elmar

    • Als Antwort vorgeschlagen Jürgen Röhr Montag, 14. Januar 2013 17:43
    • Als Antwort markiert c_joksch Dienstag, 15. Januar 2013 10:23
    Montag, 14. Januar 2013 16:01
    Beantworter
  • So z.B.:
    strink mask = "*.*";
    string master = @"c:\master";
    string replica = @"c:\replica";
    bool areEqual(Directory.GetFiles(master, mask).Length == Directory.GetFiles(replica, mask).Length );

    • Als Antwort markiert c_joksch Dienstag, 15. Januar 2013 10:23
    • Tag als Antwort aufgehoben c_joksch Dienstag, 15. Januar 2013 10:24
    Montag, 14. Januar 2013 16:02
  • Hi,

    Antworten sind beide gut, habe die von Elmar genommen.

    danke

    Cay

    Dienstag, 15. Januar 2013 10:23