Array.Sort für DirectoryInfo.GetFiles nach Datum

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Array.Sort für DirectoryInfo.GetFiles nach Datum

    Hallo,

    Mit DirectoryInfo.GetFiles() bekomme ich ein Array allerdings, verwirrt mich die Sortierung. Es ist nicht dieselbe Reihenfolge wie im Ordner zu sehen ist, aber irgendwie glaub ich das liegt am Ordner, ich schätze das Array ist alphabetisch?
    Ich habe es bis jetz so hinbekommen nach dem Datum zu Sortieren, womöglich nutze ich aber die falschen Elemente?

    Explizit wird mir so der Name der ältesten Datei ausgegeben (fiarr(0)).

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim Pfad = "C:\a\b\"
    3. Dim dir As DirectoryInfo = New DirectoryInfo(Pfad)
    4. Dim Dateiname As String
    5. Dim fiarr As FileInfo()
    6. fiarr = dir.GetFiles("*.txt")
    7. Dim datearr(fiarr.Count - 1) As Date
    8. Dim i As Integer = 0
    9. For Each fi In fiarr
    10. datearr(i) = fi.LastWriteTime
    11. i = i + 1
    12. Next
    13. Array.Sort(datearr, fiarr)
    14. Dateiname = Pfad & fiarr(0).ToString
    15. Console.WriteLine(Dateiname)
    16. Console.ReadKey()
    17. End Sub

    @Haudruferzappeltnoch Ja, der Explorer sortiert anders.
    Form mit ListBox und zwei Buttons:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' Sortieren von Zahlen
    3. Private fis() As IO.FileInfo
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. fis = New IO.DirectoryInfo("C:\Temp\").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Array.Sort(fis, New MyComparer())
    9. Me.ListBox1.Items.Clear()
    10. Me.ListBox1.Items.AddRange(fis)
    11. End Sub
    12. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    13. Array.Sort(fis, New ExplorerComparer())
    14. 'Array.Sort(files) ' allein sollte genügen
    15. Me.ListBox1.Items.Clear()
    16. Me.ListBox1.Items.AddRange(fis)
    17. End Sub
    18. End Class
    19. ''' <summary>
    20. ''' Klasse, die Dateien wie im Exlorer sortiert
    21. ''' </summary>
    22. ''' <remarks></remarks>
    23. Public Class ExplorerComparer
    24. Implements IComparer(Of IO.FileInfo)
    25. Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" ( _
    26. ByVal s1 As String, _
    27. ByVal s2 As String) As Int32
    28. Public Function Compare(ByVal x As IO.FileInfo, ByVal y As IO.FileInfo) As Integer _
    29. Implements System.Collections.Generic.IComparer(Of IO.FileInfo).Compare
    30. Return StrCmpLogicalW(x.FullName, y.FullName)
    31. End Function
    32. End Class
    33. ' Standard-Comparer
    34. Public Class MyComparer
    35. Implements IComparer(Of IO.FileInfo)
    36. Public Function Compare(ByVal x As IO.FileInfo, ByVal y As IO.FileInfo) As Integer _
    37. Implements System.Collections.Generic.IComparer(Of IO.FileInfo).Compare
    38. Return String.Compare(x.FullName, y.FullName)
    39. End Function
    40. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke euch, bei LINQ habe ich immer das Problem mir die Syntax zu merken, die finde ich bei Microsoft irgendwie nicht

    OrderByMicrosoft
    Was bedeutet da die < > einklammerung?

    Oder anders gefragt warum Function(x)? x ist scheinbar das Getfiles ArrayElement. Aber woher weiß der das.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    ich denke, zum einen Buch lesen (zB Löffelmann, oder Kühnel/Leibhard), Kapitel "anonyme Methoden". Das kann die Frage beantworten, warum Function().

    Zum anderen ein weiteres Kapitel, "Extension-Methods". (Dazu gibts übrigens auch ein Tut im Allgemein-Bereich).

    Als drittes Generica verstehen (noch ein Kapitel). Das erklärt schliesslich, woher der Compiler weiss, dass x ein FileInfo ist, und nicht eine Butterblume.

    (Hier kann ich auch vorgreifen: Er weiss dass, weil DirectoryInfo.GetFiles ein FileInfo-Array zurückgibt, also etwas, wo halt nix anneres drinne sein kann als FileInfo)
    Aber auch hier Kapitel lesen - meine zusammengestoppelten Erklärungen sind kaum Halbwahrheiten.
    Ne ist schon auf vb. Ich erkenne da nur nichts so schnell wieder^^

    Ok ich weiß, was eine anonyme Funktion ist und weiß jetzt auch was das <Extension()> bedeutet.
    x ist wahrscheinlich automatisch ein Element des IEnumerable auf das OrderBy angewendet ist. Ich sehe der Name ist beliebig und kann auch abc sein.

    Dass der Compiler automatisch den richtigen Typ dann zuordnet sei mal geschenkt.
    Ich schätze .OrderBy(Function(ByVal x as FileInfo) x.LastWriteDate) ist trotzdem gültig? So sind mir die Parameter bisher vertraut gewesen, daher hat mich diese Function erstmal verwirrt.

    Die Function selbst ist denke ich mal der keySelector?

    Func(Of FileInfo, Date) steht bei mir in der Beschreibung an dieser Stelle und das verwirrt mich noch weil eigentlich habe ich ja nur einen Parameter in der Funktion

    TSource ist scheinbar das was vorne dranhängt an OrderBy, TKey ist das Date und ist dann wohl der Rückgabewert der Funktion. Dazu die Frage warum steht da kein Return woher weiß die Funktion, dass das der Rückgabewert sein soll?

    Haudruferzappeltnoch schrieb:

    Ich schätze .OrderBy(Function(ByVal x as FileInfo) x.LastWriteDate) ist trotzdem gültig?
    Ja, ist es. Aber das ist auch redundant. Wenn Du eine List(Of FileInfo) hast und darauf eine Extension wie OrderBy anwendest, ist für den Compiler selbst mit Option Infer Off klar, dass nur Elemente vom Typ FileInfo in die Function reingehen.

    Haudruferzappeltnoch schrieb:

    Func(Of FileInfo, Date) steht bei mir in der Beschreibung an dieser Stelle und das verwirrt mich noch weil eigentlich habe ich ja nur einen Parameter in der Funktion
    Du hast nur einen Parameter, der rein geht. Aber der Rückgabewert ist an Position 2 angegeben. Es geht ne FileInfo rein, ein Date kommt raus. Also: Jede FileInfo wird "befragt" und spuckt irgendetwas vom Typ Date wieder aus. In dem Fall eben ihren LastWriteDate-Property-Wert. Und warum ist das jetzt ohne Return möglich? Die Magie anonymer Funktionen vielleicht. Hab ich mir noch nie drüber Gedanken gemacht :whistling:
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.