Bilder nach Namen oder CreationTime sortieren

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

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bilder nach Namen oder CreationTime sortieren

    Hallo liebes Forum,

    Ich muss Bilder sortieren. Die Bilder sollen nur in einer ListBox zu sehen sein. Das Programm soll nichts kopieren etc. Ich habe eine einfache Beispielreihe kreiert. Die Bilder heißen so:
    img00000001
    img00000002
    img00000003
    usw.

    Eines verbraucht zwischen 750 kB und 1MB.

    Dann werden sie der neuen Reihenfolge nach weiterverarbeitet. Hat jemand einen Ansatz für mich? Mit Sortier-Programmierung kenn ich mich gar nicht aus.
    Also am Ende würde eine geordnete List (of String) mit den Namen (und Pfad) reichen...
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Bartosz Was hat der Name zum Sortieren mit der Dateigröße zu tun?
    Was ist bei der Reihenfolge anders als wenn Du die Info mit .GetFiles() holst?
    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!
    @RodFromGermany Größe der Datei - wusste nicht, ob das wichtig ist.
    Könnte ja sein, dass er die in der falschen Reihenfolge holt (WhatsApp sendet auch nach Größe, wenn du mehrere Bilder zum Senden anwählst).
    Heute kam mir etwas dazwischen. Normalerweise hätte ich parallel das Projekt kreiert. Ich fange jetzt an.

    ==============================
    Also, mit dem festen Dateipfad und .GetFiles sind diese Testbilder in der richtigen Reihenfolge. Müssen nicht sortiert werden. Jetzt will ich andere Bilder (z.B. von Eigene Bilder) nehmen. Diese müssen sortiert werden.
    ==================================
    Nachfrage: Kann es sein, dass er sich die Bilder holt, wie sie erschaffen worden sind? Ich meine, Img001 wurde früher erschaffen als Img002. Also dann muss es ja von vornherein richtig sein?



    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bartosz“ ()

    @Bartosz Bei der Benennung dieser Bilder sind die alphabetische und die chronologische Sortiereung gleich.
    Teste Deinen Algo an "zufälligeren" Dateinamen.
    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!
    Hab mal Dateien von nem „Linux NAS“ per geladen. Da war die Reihenfolge komplett anders als auf meinem Windows PC...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich stelle fest, dass eben bei den Testbildern keine Sortierarbeit erforderlich ist, da die automatische Sortierung nach dem Namen auch der Chronologie entspricht. Ok.
    "Zufälligere" Bilder aus dem Ordner Eigene Bilder werden auch alphabetisch eingelesen. Hier muss ich nach Zeit sortieren.
    Dann brauche ich jetzt die Erstellzeit-Info eines jeden Bildes. Hilft es mir, von jeder File die CreationTime Property zu nutzen?
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Bartosz schrieb:

    Hilft es mir, von jeder File die CreationTime Property zu nutzen
    Um danach sortieren zu können wäre die Info ganz hilfteich ...

    Per LINQ lassen sich Listen ganz gut
    sortieren nach allem was man so will...

    docs.microsoft.com/de-de/dotne….orderby?view=netcore-3.1
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich hab in der Zwischenzeit was getan.

    Dies ist mein Testcode. Ich durchsuche ein bestimmetes Verzeichnis und finde die Bilddateien. Ich bneutze 2 Listen. In einer stehen die FullNames
    (C:\Users\HP\Pictures\xxxxxxx.jpg), in der anderen der zusammengesetzte Zeitstring (YYYY_MM_DD_hh_mm_ss). Letztere Liste wird sortiert.
    Das klappt alles, ich hab's kontrolliert. Jetzt muss ich es nur noch hinkriegen, dass die Liste mit den Namen genau so umsortiert wird.

    VB.NET-Quellcode

    1. Private Sub ScanDirectory(ByVal akt_Directory As IO.DirectoryInfo)
    2. Dim MyList = New List(Of String) From {".png", ".jpg"}
    3. Dim Liste_gefunden As New List(Of String)
    4. Dim Liste_CreationTime_neuer_String As New List(Of String)
    5. Dim buffer As String = ""
    6. For Each File In akt_Directory.GetFiles
    7. Try
    8. If MyList.Contains(File.Extension.ToLower()) Then
    9. If (Index < Byte.MaxValue) Then
    10. Liste_gefunden.Add(File.FullName)
    11. buffer = File.CreationTime.Year & "_" & File.CreationTime.Month & "_" & File.CreationTime.Day & "_" & File.CreationTime.Hour & "_" & File.CreationTime.Minute & "_" & File.CreationTime.Second
    12. Liste_CreationTime_neuer_String.Add(buffer)
    13. Index += Convert.ToByte(1)
    14. TextBox1.Text = Index.ToString
    15. TextBox1.Refresh()
    16. Else
    17. Exit For
    18. End If
    19. End If
    20. Catch ex As UnauthorizedAccessException
    21. ScanDirectory(akt_Directory)
    22. End Try
    23. Next
    24. Liste_CreationTime_neuer_String.Sort()
    25. For i As Integer = 0 To Liste_CreationTime_neuer_String.Count - 1 Step 1
    26. ListBox1.Items.Add(Liste_CreationTime_neuer_String(i))
    27. Next
    28. End Sub
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Dksksm Danke für den kurzen Code, aber leider ändert sich nichts.

    VB.NET-Quellcode

    1. Private Sub ScanDirectory(ByVal akt_Directory As IO.DirectoryInfo)
    2. Dim MyList = New List(Of String) From {".png", ".jpg"}
    3. Dim Liste_gefunden As New List(Of String)
    4. Dim Liste_CreationTime_neuer_String As New List(Of String)
    5. Dim buffer As String = ""
    6. Dim Liste_FI As New List(Of IO.FileInfo)
    7. For Each File In akt_Directory.GetFiles
    8. Try
    9. If MyList.Contains(File.Extension.ToLower()) Then
    10. If (Index < Byte.MaxValue) Then
    11. Liste_FI.Add(My.Computer.FileSystem.GetFileInfo(File.FullName))
    12. 'Liste_gefunden.Add(File.FullName)
    13. 'buffer = File.CreationTime.Year & "_" & File.CreationTime.Month & "_" & File.CreationTime.Day & "_" & File.CreationTime.Hour & "_" & File.CreationTime.Minute & "_" & File.CreationTime.Second
    14. 'Liste_CreationTime_neuer_String.Add(buffer)
    15. Index += Convert.ToByte(1)
    16. TextBox1.Text = Index.ToString
    17. TextBox1.Refresh()
    18. Else
    19. Exit For
    20. End If
    21. End If
    22. Catch ex As UnauthorizedAccessException
    23. ScanDirectory(akt_Directory)
    24. End Try
    25. Next
    26. ''Liste_CreationTime_neuer_String.Sort()
    27. Liste_FI.OrderBy(Function(Info As IO.FileInfo) Info.CreationTime) ' Hier passiert nichts :(
    28. For i As Integer = 0 To Liste_FI.Count - 1 Step 1
    29. 'ListBox1.Items.Add(Liste_CreationTime_neuer_String(i))
    30. ListBox1.Items.Add(Liste_FI(i).FullName)
    31. Next
    32. End Sub

    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Dksksm Das kompiliert nicht, da FileInfo nicht in Integer konvertiert werden kann. --> Liste_FI(i).FullName
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Ich danke dir für deine Mühe, am Pfingstsonntag mir zu helfen. Ich weiß, dass ich nah dran bin, aber irgendwo noch der Wurm drin ist..
    2 Listen zu haben ist wirklich nicht optimal ^^

    ich muss nur dieses query richtig verwenden

    VB.NET-Quellcode

    1. Dim query As IEnumerable(Of IO.FileInfo) = Liste_FI.OrderBy(Function(Info As IO.FileInfo) Info.CreationTime)

    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Dksksm Jup hab ich auch. Funktioniert!

    Danke euch!

    Hier nochmal der aufgeräumte Code

    VB.NET-Quellcode

    1. Private Sub ScanDirectory(ByVal akt_Directory As IO.DirectoryInfo)
    2. Dim MyList = New List(Of String) From {".png", ".jpg"}
    3. Dim Liste_FI As New List(Of IO.FileInfo)
    4. For Each File In akt_Directory.GetFiles
    5. Try
    6. If MyList.Contains(File.Extension.ToLower()) Then
    7. If (Index < Byte.MaxValue) Then
    8. Liste_FI.Add(My.Computer.FileSystem.GetFileInfo(File.FullName))
    9. Index += Convert.ToByte(1)
    10. TextBox1.Text = Index.ToString
    11. TextBox1.Refresh()
    12. Else
    13. Exit For
    14. End If
    15. End If
    16. Catch ex As UnauthorizedAccessException
    17. ScanDirectory(akt_Directory)
    18. End Try
    19. Next
    20. Dim query As IEnumerable(Of IO.FileInfo) = Liste_FI.OrderBy(Function(Info As IO.FileInfo) Info.CreationTime)
    21. For Each fi As IO.FileInfo In query
    22. ListBox1.Items.Add(fi.FullName)
    23. Next
    24. End Sub
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Dein

    VB.NET-Quellcode

    1. For Each fi As IO.FileInfo In query
    2. ListBox1.Items.Add(fi.FullName)
    3. Next


    ist nicht nötig, denn fi ist hier bereits vom Datentyp IO.FileInfo. Genau wie bei mir die Varibale item ebenso vom Datentyp IO.FileInfo ist. Wie denkst Du denn kann ansonsten auf item.FullName zugegriffen werden?
    Stimmt, ich habe jetzt dein

    VB.NET-Quellcode

    1. For Each item In query
    2. ListBox1.Items.Add(item.FullName)
    3. Next


    eingebaut.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.