none
Liste aller Files mit Versionsnummern RRS feed

  • Frage

  • Hallo,

    habe eine Frage zum erstellen einer Liste.

    Bis jetzt habe ich es so gelöst:

    List<string>newInstallation = Directory.GetFiles(SelectedForProcessModel._textBlockNewInstallPath, "*.*", SearchOption.AllDirectories).ToList();
    

    danach habe ich eine Foreachschleife in der ich mit FileInfo Abfrage welche Datei eine Versionsnummer hat.

    Gibt es da einen kürzeren Weg???

    Weil ich das ganze 2 mal mache (mit unterschiedlichen Verzeichnissen)und dann die beiden Listen vergleiche.

    Dachte darann das alles schon in dem Directory.GetFiles zu erledigen

    grüße

    Cay


    • Bearbeitet joksch_c Montag, 20. Oktober 2014 12:50
    Montag, 20. Oktober 2014 12:49

Antworten

  • Hallo,
    zunächst brauchst garkeine List<T>. Die Directory.GetFiles-Methode gibt ein String Array zurück, das erzeugen einer Liste daraus verschlechtert nur die Leistung.

    Wenn du sowieso nur FileInfo-Objekte brauchst, kannst du diese auch wie folgt bekommen:

    var fis = new DirectoryInfo("PFAD").GetFiles("*.*", SearchOption.AllDirectories);

    Nun ist die Frage was genau du denn machen willst. Vergleichen kann bei Listen viele Bedeutungen haben.

    Grundsätzlich könntest du beide FileInfo-Arrays in einer for/foreach-Schleife durchlaufen und vergleichen. Jedoch solltest du auch darauf achten das die Reihenfolgen nicht die selben sein müssen und dass sich die Längen der Arrays unterscheiden können.

    var fis1 = new DirectoryInfo("path1").GetFiles("*.*", SearchOption.AllDirectories);
    var fis2 = new DirectoryInfo("path2").GetFiles("*.*", SearchOption.AllDirectories);
    
    if (fis1.Length != fis2.Length)
        Console.WriteLine("Listen sind unterschiedlich lang");
    else
    {
        foreach (var fi in fis1)
        {
            if(!/*überprüfe ob fi in fis2 enthalten ist, nach deinen kriterien*/){
                Console.WriteLine("Listen sind unterschiedlich");
            }
        }
    }
    Wenn es dir nur um die Versionsnummern geht, könntest du auch nur diese heraus filtern:
    var fis1 = Directory.GetFiles("path1", "*.*", SearchOption.AllDirectories).Select(x => new { File = x, Version = FileVersionInfo.GetVersionInfo(x).FileVersion });
    var fis2 = Directory.GetFiles("path2", "*.*", SearchOption.AllDirectories).Select(x => new { File = x, Version = FileVersionInfo.GetVersionInfo(x).FileVersion });
    Über die Except- und Intersect-Methode kannst du die Elemente heraus filtern, welche in beiden Listen, oder die die nur in einer Liste enthalten sind.
    Dabei könnte diese Klasse hilfen, um nur anhand der Dateinamen zu vergleichen.

    So oder so brauchen wir, für detailiertere Hilfe, mehr Infos wie du die Dateien vergleichen willst und was am Ende dabei heraus kommen soll.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert joksch_c Montag, 20. Oktober 2014 13:45
    Montag, 20. Oktober 2014 13:13
    Moderator

Alle Antworten

  • Hallo,
    zunächst brauchst garkeine List<T>. Die Directory.GetFiles-Methode gibt ein String Array zurück, das erzeugen einer Liste daraus verschlechtert nur die Leistung.

    Wenn du sowieso nur FileInfo-Objekte brauchst, kannst du diese auch wie folgt bekommen:

    var fis = new DirectoryInfo("PFAD").GetFiles("*.*", SearchOption.AllDirectories);

    Nun ist die Frage was genau du denn machen willst. Vergleichen kann bei Listen viele Bedeutungen haben.

    Grundsätzlich könntest du beide FileInfo-Arrays in einer for/foreach-Schleife durchlaufen und vergleichen. Jedoch solltest du auch darauf achten das die Reihenfolgen nicht die selben sein müssen und dass sich die Längen der Arrays unterscheiden können.

    var fis1 = new DirectoryInfo("path1").GetFiles("*.*", SearchOption.AllDirectories);
    var fis2 = new DirectoryInfo("path2").GetFiles("*.*", SearchOption.AllDirectories);
    
    if (fis1.Length != fis2.Length)
        Console.WriteLine("Listen sind unterschiedlich lang");
    else
    {
        foreach (var fi in fis1)
        {
            if(!/*überprüfe ob fi in fis2 enthalten ist, nach deinen kriterien*/){
                Console.WriteLine("Listen sind unterschiedlich");
            }
        }
    }
    Wenn es dir nur um die Versionsnummern geht, könntest du auch nur diese heraus filtern:
    var fis1 = Directory.GetFiles("path1", "*.*", SearchOption.AllDirectories).Select(x => new { File = x, Version = FileVersionInfo.GetVersionInfo(x).FileVersion });
    var fis2 = Directory.GetFiles("path2", "*.*", SearchOption.AllDirectories).Select(x => new { File = x, Version = FileVersionInfo.GetVersionInfo(x).FileVersion });
    Über die Except- und Intersect-Methode kannst du die Elemente heraus filtern, welche in beiden Listen, oder die die nur in einer Liste enthalten sind.
    Dabei könnte diese Klasse hilfen, um nur anhand der Dateinamen zu vergleichen.

    So oder so brauchen wir, für detailiertere Hilfe, mehr Infos wie du die Dateien vergleichen willst und was am Ende dabei heraus kommen soll.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert joksch_c Montag, 20. Oktober 2014 13:45
    Montag, 20. Oktober 2014 13:13
    Moderator
  • Hallo,

    super danke ich benötige legentlich die Versionsnummern aus den ganzen Files.

    Das sollte mit weiterhelfen.

    Danke

    Cay

    Montag, 20. Oktober 2014 13:45