Arbeiten mit DirectoryInfo und LINQ

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Arbeiten mit DirectoryInfo und LINQ

    Hi,

    ich habe versucht die Anregung von Vaporized umzusetzen und möchte die unter LINQ erzeugten DirectoryInfo in eine Datagridview speichern. Hier mein Coding:

    VB.NET-Quellcode

    1. dgvDisplayFrames.Rows.Clear()
    2. Dim FileNamesSorted As IEnumerable(Of String)
    3. Try
    4. Dim Dir = New IO.DirectoryInfo(PreviewFrames.VIDEOFOLDER)
    5. FileNamesSorted = Dir.GetFiles("img*.png").OrderBy(Function(x) x.LastWriteTime).Select(Function(x) x.FullName)
    6. Catch ex As Exception
    7. MessageBox.Show("Load Frames: " & ex.Message)
    8. End Try
    9. For Each entry In FileNamesSorted
    10. '... hier will ich auf FullName und LastWriteTime zugreifen und in eine dgv speichern
    11. Next
    12. dgvDisplayFrames.ClearSelection()


    Ixh weiß jetzt nicht, wie ich auf FullName und LastWriteTime zugreifen kann .... was aber wohl daran liegt, dass ich die LINQ Syntax nicht beherrsche. Ich muss wohl irgendwie dafür sorgen, dass auch die LastWriteTime mit ausgegeben wird ... sonst kriege ich nur den Objectnamen. Aber das mit der LastWriteTime kriege ich nicht gebacken ...

    Kann mir jemand nachsichtig helfen ? :)

    LG
    Peter
    ich habs dir doch geschrieben, oder was war der Haken daran?

    ErfinderDesRades schrieb:

    Probier auch mal so:

    VB.NET-Quellcode

    1. Dim di = New IO.DirectoryInfo(Verzeichnispfad)
    2. Dim files = di.GetFiles.OrderBy(Function(x) x.LastWriteTime).ToList()
    3. Datagridview1.DataSource = files




    Ansonsten ist sowas ein schlechter Ansatz:

    Peter329 schrieb:

    VB.NET-Quellcode

    1. '... hier will ich auf FullName und LastWriteTime zugreifen und in eine dgv speichern
    In einem dgv soll man keine Daten speichern.

    Minimale Variation des bereits gezeigten:

    VB.NET-Quellcode

    1. Private files As List(Of FileInfo)
    2. [...]
    3. Dim di = New IO.DirectoryInfo(Verzeichnispfad)
    4. files = di.GetFiles.OrderBy(Function(x) x.LastWriteTime).ToList()
    5. Datagridview1.DataSource = files
    Hier sind die FileInfos nun in einer Variablen, files, gespeichert und sind dort fabelhaft zugreifbar.

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

    Das ist der Punkt. das .Select(Function(x) x.FullName) "extrahiert" aus den FileInfos nur alle Dateipfade und schiebt sie in die Variable FileNamesSorted. Daher solltest Du das dort weglassen und erst verwenden, wenn Du nur die Dateipfade brauchst. Das Weglassen des Selects führt dazu, dass in FileNamesSorted dann FileInfos drinstehen. Und die enthalten auch deren LastWriteTime. Daher:

    VB.NET-Quellcode

    1. Dim Files As IEnumerable(Of IO.FileInfo)
    2. Try
    3. Dim Dir = New IO.DirectoryInfo(PreviewFrames.VIDEOFOLDER)
    4. Files = Dir.GetFiles("img*.png").OrderBy(Function(x) x.LastWriteTime)
    5. Catch ex As Exception
    6. MessageBox.Show("Load Frames: " & ex.Message)
    7. End Try
    8. For Each entry In Files
    9. '... hier will ich auf FullName und LastWriteTime zugreifen und in eine dgv speichern
    10. Next

    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.

    ErfinderDesRades schrieb:

    In einem dgv soll man keine Daten speichern.


    Das will ich ja auch gar nicht ! Ich will die Daten auswerten (z.B. Samples pro Sekunde, etc.)

    Also ich meine, verstanden zu haben, dass ich mit LINQ die komplette DirInfo auswählen muss. Ich habe jetzt die Syntax nach euren Hinweisen angepasst.

    1. EDR

    VB.NET-Quellcode

    1. Dim Dir = New IO.DirectoryInfo(PreviewFrames.VIDEOFOLDER)
    2. FileNamesSorted = Dir.GetFiles("img*.png").OrderBy(Function(x) x.LastWriteTime).ToList()


    Das liefert eine Exception (s. Error1.jpg)

    2. Vaporized

    VB.NET-Quellcode

    1. Dim Dir = New IO.DirectoryInfo(PreviewFrames.VIDEOFOLDER)
    2. FileNamesSorted = Dir.GetFiles("img*.png").OrderBy(Function(x) x.LastWriteTime)


    Damit erhalte ich auch eine Exception (s. Error2.jpg)

    Wahrscheinlich stelle ich mich wieder mal super blöde an. Aber ich hoffe, ihr könnt mir trotzdem nachsichtig weiterhelfen ... :)

    LG
    Peter
    Bilder
    • Error1.jpg

      8,75 kB, 368×171, 66 mal angesehen
    • Error2.jpg

      10,2 kB, 477×171, 57 mal angesehen
    Deswegen sprach mein Code auch von Dim Files As IEnumerable(Of IO.FileInfo)!, nicht von IEnumerable(Of String)
    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.
    ouch ... hast ja Recht ...

    VB.NET-Quellcode

    1. Dim FileNamesSorted As IEnumerable(Of IO.FileInfo) = Nothing


    Das hatte ich vergessen anzupassesn .... jetzt funzt die Sache... ! :)

    Danke, ihr beiden !

    LG
    Peter

    Peter329 schrieb:

    Das will ich ja auch gar nicht ! Ich will die Daten auswerten (z.B. Samples pro Sekunde, etc.)
    Auch auswerten tut man nicht ein DGV, sondern die List(Of FileInfo).
    Weil die ist typisiert, während du bei dgv-Zellen prinzipiell nie wissen kannst, was drinne ist.

    Peter329 schrieb:

    Also ich meine, verstanden zu haben, dass ich mit LINQ die komplette DirInfo auswählen muss.
    Must du nicht - ist nur das einfachste.

    Eine lokale Variable FileNamesSorted sollte es auch garnet mehr geben.
    weil die kannste natürlich nicht auswerten, bzw. nur lokal.

    Stattdessen - s. post#2 - letztes Snippet - habe ich eine KlassenVariable files eingeführt.
    Ich bin immer sehr dankbar für positive Kritik. Aber deine Einwände verstehe ich nicht so ganz.

    Ich verwende die DirectoryInfo, um damit bestimmte Auswertungen zu erstellen. Z.B. will ich anhand von LastWriteTime ermitteln, wie viele Screenshots in jeder Sekunde erstellt worden sind. Dazu zähle ich die Anzahl der Frames, die in der gleichen Sekunde geschrieben werden. Außerdem halte ich den Startzeitpunkt und den Endhzeitpunkt fest ... das sind der kleinste bzw. der größte Inhalt von LastWriteTime.

    Programmtechnisch ist das ein einstufiger Gruppenwechsel ... mit Initialisierung, Gruppenvorlauf, Gruppenverarbeitung, Gruppenwechselverarbeitung und Abschluss .... eine Standardaufgabe der EDV.

    Und die Ergebnisse der Gruppenverarbeitung stelle ich dann in einer DatagridView dar. Die gdv wird nur mit rows.add befüllt, sie ist Read Only .... und wird ansonsten nie im meinem Programm explizit gelesen.

    Übrigens: FileNameSorted ist bei mir eine Klassenvariable.

    Also ich weiß eigentlich nicht, was an meinem Vorgehen so grundsätzlich falsch sein sollte.

    Versteh mich nicht falsch: ich bin sehr dankbar für eure Expertise ... und die möchte ich auch nicht in Frage stellen. Aber ich würde das halt gern verstehen und richtig einordnen.

    LG
    Peter
    Bilder
    • s 2020-05-26 08-59-275.jpg

      82,84 kB, 611×545, 57 mal angesehen

    ErfinderDesRades schrieb:

    Auch auswerten tut man nicht ein DGV, sondern die List(Of FileInfo)

    Peter329 schrieb:

    Und die Ergebnisse der Gruppenverarbeitung stelle ich dann in einer DatagridView dar.

    Meine Meinung: Entweder Ihr schreibt gerade aneinander vorbei oder Ihr seid bereits einer Meinung. Wenn die Ergebnisse erst berechnet und dann nur im DGV dargestellt werden, ist doch alles gut.
    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.
    naja - dann ist alles gut :thumbup:
    Dann war der einziger "Fehler" eine missverständliche Kommunikation, sodass mir der Eindruck entstand, du wollest die Daten im dgv speichern, und dort verarbeiten.
    Dein Code zeigte auch nicht, dass FileNamesSorted eine Klassenvariable war, sondern zeigte das Gegenteil.
    Einzig mein post #2 zeigte eindeutig eine Klassenvariable (Private), vorher und nachher hiess es überall immer nur Dim.
    Was (leider) auch eine Klassenvariable sein kann - aber sah an keiner Stelle so aus.

    Peter329 schrieb:

    Ich bin immer sehr dankbar für positive Kritik.
    Klingt so, als hätte ich mich (für deine Ohren) im Ton vergriffen.
    Jo, ich bin nicht sehr begabt mit Tönen, und geb mir auch nicht viel Mühe damit.
    Ich kann mich nichtmal von Herzen entschuldigen, obwohls mir schon iwie bisserl leid tut.
    Ich mäkel halt an allem rum, wo ich rumzumäkeln was finde, und wenn man das nicht persönlich nimmt, dann kann das nur nützen, keinesfalls schaden, ist meine Ansicht.
    "positive" / "negative" Kritik ist für mich ein Unwort - was soll das sein - "positive" Kritik?
    Nur Lob kann nicht damit gemeint sein, das wäre definitiv zu blöd.

    Also für mich gibts nur Kritik.
    Es gibt berechtigte und unberechtigte. Dazu gibts noch Lob/Herabsetzung, aber das ist keine Kritik, wie ich den Begriff verstehe.

    Aber um aufs Mäkeln zurückzukommen - praktisches Beispiel: FileNameSorted ist falsch benamt - FileInfos sind viel mehr als nur Namen.
    (Eine typische EDR-Kritik: kurz, präzise, begründet, deutlich.
    Und ohne was ich "sozialpädagogischen Weichmacher" nenne.)

    ErfinderDesRades schrieb:

    Klingt so, als hätte ich mich (für deine Ohren) im Ton vergriffen.


    Nö, haste doch gar nicht ! Sonst hätte ich dir das schon gesagt ! :)

    Schön, dass wir uns einig sind. Dann hab ich wohl alles richtig verstancen !

    Danke noch mal für eure Ratschläge und einen schönen Tag !

    LG
    Peter