Zuletzt geöffnete Dateien

    • VB.NET

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

      Zuletzt geöffnete Dateien

      Hallo Community

      Sehr viele Programme zeigen die zuletzt geöffneten Dateien/Dokumente an, um so schneller Zugriff auf diese zu haben. Das kann auch für eigene Programme recht nützlich sein (z.B. für ein Textverarbeitungsprogramm, etc.). Um so etwas zu realisieren, kann man auf verschiedene Art und Weise vorgehen. Bei jeder Variante muss auf jeden Fall die Information irgendwo gespeichert werden. Zum Beispiel:
      - Textdatei
      - typisiertes Dataset (kommt im nächsten Teil)

      Textdatei

      Vorteile dieser Methode:
      - schnell und einfach zu programmieren
      - hinterlässt keine Reste auf dem Rechner

      Nachteile:
      - auch Laien, die die Textdatei finden, können diese verändern, löschen, etc.
      - die Datei muss in einem fixen Dateipfad sein und darf nicht verschoben werden

      Beispiel für das Laden und Speichern der zuletzt geöffneten Dokumente mit einer Textdatei

      Die Datei heißt "Files.txt" und liegt im AppData-Verzeichnis.
      EDIT: Den Code habe ich angepasst, aufgrund der Kritik von @VincentTB (Danke nochmal :))

      Die Imports:

      VB.NET-Quellcode

      1. Imports System.IO

      Bei dieser Methode benötigen wir nur eine Konstante für die maximale Anzahl der zuletzt geöffneten, die angezeigt werden sollen. Dafür aber noch zwei Variablen

      VB.NET-Quellcode

      1. Const maxFiles As Integer = 5
      2. Private LastFiles As New List(Of FileInfo)
      3. Private textfile As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Files.txt"))

      Hier der Code, um die Dateinamen in die Listbox zu laden:

      VB.NET-Quellcode

      1. Private Sub GetLastFiles()
      2. Dim textfile As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Files.txt"))
      3. 'Überprüfen, ob die Textdatei existiert (im AppData-Verzeichnis)
      4. If File.Exists(textfile.FullName) Then
      5. 'Die Zeilen der Textdatei auslesen
      6. Dim files() As String = File.ReadAllLines(textfile.FullName)
      7. 'Die letzten Zeilen der Liste als erstes hinzufügen
      8. For i As Integer = files.Count - 1 To 0 Step -1
      9. If Not files(i) = "" Then
      10. LastFiles.Add(New FileInfo(files(i)))
      11. 'Wenn die Liste die maximale Anzahl der Dateien erreicht hat )-> Schleife beenden
      12. If LastFiles.Count = maxFiles Then
      13. Exit For
      14. End If
      15. End If
      16. Next
      17. 'LastFiles Liste an die Listbox binden
      18. ListBox1.DataSource = LastFiles
      19. 'Nur den Namen der Datei anzeigen
      20. ListBox1.DisplayMember = "Name"
      21. End If
      22. End Sub

      So wird eine neue Datei der Textdatei hinzugefügt:

      VB.NET-Quellcode

      1. Public Sub AddFileToList(ByVal FilePath As String)
      2. 'Die Zeilen der Textdatei auslesen
      3. Dim lines() As String = File.ReadAllLines(textfile.FullName)
      4. Using sw As New StreamWriter(textfile.FullName)
      5. 'Alle Zeilen durchgehen
      6. For i As Integer = 0 To lines.Count - 1
      7. 'Falls eine Zeile den Pfad enthält, der gerade hinzugefügt werden soll, wird die alte Zeile in der Textdatei mit dem Pfad entfernt
      8. If Not lines(i) = FilePath Then
      9. sw.WriteLine(lines(i))
      10. End If
      11. Next
      12. 'Pfad, der hinzugefügt werden soll in Textdatei schreiben.
      13. sw.WriteLine(FilePath)
      14. End Using
      15. End Sub

      Wir haben wieder die selbe Startform, wie im Registry-Beispiel und die Anwendung hat genau den gleichen Click-Event des Button und den selben DoubleClick-Event der Listbox, wie im Registry-Beispiel. Hier also der komplette Code der Form:

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.IO
      3. Public Class Form1
      4. Const maxFiles As Integer = 5
      5. Private LastFiles As New List(Of FileInfo)
      6. Private textfile As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Files.txt"))
      7. Private Sub GetLastFiles()
      8. Dim textfile As New FileInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Files.txt"))
      9. 'Überprüfen, ob die Textdatei existiert (im AppData-Verzeichnis)
      10. If File.Exists(textfile.FullName) Then
      11. 'Die Zeilen der Textdatei auslesen
      12. Dim files() As String = File.ReadAllLines(textfile.FullName)
      13. 'Die letzten Zeilen der Liste als erstes hinzufügen
      14. For i As Integer = files.Count - 1 To 0 Step -1
      15. If Not files(i) = "" Then
      16. LastFiles.Add(New FileInfo(files(i)))
      17. 'Wenn die Liste die maximale Anzahl der Dateien erreicht hat )-> Schleife beenden
      18. If LastFiles.Count = maxFiles Then
      19. Exit For
      20. End If
      21. End If
      22. Next
      23. 'LastFiles Liste an die Listbox binden
      24. ListBox1.DataSource = LastFiles
      25. 'Nur den Namen der Datei anzeigen
      26. ListBox1.DisplayMember = "Name"
      27. End If
      28. End Sub
      29. Public Sub AddFileToList(ByVal FilePath As String)
      30. 'Die Zeilen der Textdatei auslesen
      31. Dim lines() As String = File.ReadAllLines(textfile.FullName)
      32. Using sw As New StreamWriter(textfile.FullName)
      33. 'Alle Zeilen durchgehen
      34. For i As Integer = 0 To lines.Count - 1
      35. 'Falls eine Zeile den Pfad enthält, der gerade hinzugefügt werden soll, wird die alte Zeile in der Textdatei mit dem Pfad entfernt
      36. If Not lines(i) = FilePath Then
      37. sw.WriteLine(lines(i))
      38. End If
      39. Next
      40. 'Pfad, der hinzugefügt werden soll in Textdatei schreiben.
      41. sw.WriteLine(FilePath)
      42. End Using
      43. End Sub
      44. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      45. Using ofd As New OpenFileDialog
      46. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      47. AddFileToList(ofd.FileName)
      48. Process.Start(ofd.FileName)
      49. End If
      50. End Using
      51. End Sub
      52. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      53. GetLastFiles()
      54. End Sub
      55. Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
      56. If Not ListBox1.SelectedItems.Count = 0 Then
      57. Process.Start(ListBox1.SelectedItem.ToString)
      58. End If
      59. End Sub
      60. End Class


      Welche Variante ihr wählt ist auch überlassen. Eine Methode mit nur Vorteilen gibt es denke ich nicht.

      Das ist mein erstes Tutorial und ich hoffe ich konnte euch helfen. Es ist hauptsächlich für Anfänger gedacht, um zu lernen Daten zu speichern und zu laden aus Textdateien oder aus der Registry. Seit nicht so streng mit mir, falls mein Code nicht ganz sauber ist ;) Für Kritik und Verbesserungen bin ich stets offen.

      Gruß
      Switcherlapp97
      Bilder
      • zuletzt_geöffnete_dateien.png

        22,21 kB, 278×281, 292 mal angesehen
      RubiksCubeSolver


      Jetzt im Showroom

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Switcherlapp97“ ()

      Switcherlapp97 schrieb:

      VB.NET-Quellcode

      1. File.Create(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)))

      Was soll das denn? :D

      Und den Pfad gibst du fast 10x ein. Wieso keine FileInfo als Memberobjekt? Generell: [VB.NET] Keine Strings in die File-Listbox!

      Und Registry geht ja mal für ein Programm ohne Installer/Uninstaller gar nicht. So ein Programm würde ich niemals starten. Und eine Möglichkeit, die viel einfacher ist als die anderen beiden ist mit einem typisierten Dataset. Da könnte man dann auch noch andere Informationen speichern wie zB. die Häufigkeit, ... speichern.
      Mfg
      Vincent

      Wie ich dir schon per PN mitgeteilt habe:
      Schmeiß das mit der Registry gleich ganz raus. Nicht, dass einige Anfänger nich auf die Idee kommen das so zu lösen!
      Damit zerschießt du die Registry schneller als du gucken kannst. Dort sollten nur Werte verändert werden.

      Für sowas würde ich noch andere Methoden hernehmen: Gute sind Serialisierung, DataTable oder auch normale JSON-Dateien! Schreib das dazu und lösch das andere, dann biste auf der sicheren Seite. Ggf. Kann man sich auch selbst was schreiben!
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      Zuletzt geöffnete Dateien Teil 2 - Typisiertes Dataset

      Hallo,

      Die zuletzt geöffneten Dateien können auch mit einem typisierten Dataset geladen und gespeichert werden. (Danke an @VincentTB für die Idee)

      Vorteile:
      - Es können viele Informationen einfach gespeichert und verarbeitet werden
      - Das Binding vereinfacht das Programmieren
      - ...

      Nachteile:
      - Die Infos werden wieder in eine Datei geschrieben -> beim Verschieben oder Löschen dieser Datei, kann die Datei nicht mehr verwendet werden.
      - Die XML-Datei kann vom Benutzer verändert werden -> Datei ruinieren oder falsche Werte eingeben

      Als erstes muss ein typisertes Dataset erstellt werden. Das geht so:
      typisiertes Dataset erstellen

      1. In der Menüleiste auf Projekt>Neues Element hinzufügen ... und im sich öffnenden Fenster Dataset auswählen
      2. In der Namenleiste den gewünschten Namen des Datasets eingeben (bei meinem Beispiel LastFiles.xsd) und mit einem Klick auf Hinzufügen bestätigen. Dann öffnet sich der DataSet-Designer
      3. Aus der Toolbox einen DataTable auf den DataSet-Designer ziehen und umbenennen so wie es gewünscht ist (bei meinem Beispiel Files)
      4. Dem DataTable drei Spalten hinzufügen (Dateipfad, zuletzt geöffnet am und wie oft die Datei geöffnet wurde). Spalten werden mit einem Rechtsklick auf den DataTable dann Hinzufügen>Spalte und den Namen eingeben. Ich habe die Spalten Dateipfad,Datum und Anzahl benannt (es sollte dan ausschauen, wie das erste Bild im Anhang)
      5. Nun müsst ihr das Datenquellenfenster einblenden. Dafür muss man auf Menü auf Daten>Datenquellen anzeigen gehen. Dort sollte der Name, den ihr für euer DataSet gewählt habt, stehen. Wenn man diesen Eintrag aufklappt, kommt die Tabelle, die wir vorhin erstellt haben. Diese Tabelle ziehen wir per Drag und Drop auf unsere Form. Auf der Form ist jetzt ein BindingNavigator und ein DataGridView. Das können wir beides löschen. Genauso wie in der Leiste unter der Form die FilesBindingSource. (Es sollte ausschauen, wie in Bild2 im Anhang)

      Das war es dann auch schon mit dem Erstellen des Typisierten Datasets und wir können uns an den Code machen.

      EDIT: Den Code habe ich jetzt verbessert aufgrund des Hinweises von @ErfinderDesRades (Danke nochmal :))

      Wir fügen unserer Form nun eine Listbox für die Liste der zuletzt geöffneten Dateien (Listbox1) hinzu und ein Button (Button1), um neue Dateien zu öffnen. Nun müssen wir noch einen Import durchführen:

      VB.NET-Quellcode

      1. Imports System.IO

      Wir brauchen auch noch zwei Variablen und eine Konstante:

      VB.NET-Quellcode

      1. 'Speicherort der XML-Datei
      2. Private _Datafile As New FileInfo("LastFiles.xml")
      3. 'Liste mit Fileinfos über die zuletzt geöffneten Dateien
      4. Private Files As New List(Of FileInfo)
      5. 'Anzahl der zuletzt gesöffneten Dateien, die angezeigt werden sollen
      6. Const maxFiles As Integer = 5

      Hier zwei Subs, um die Daten im DataTable zu speichern bzw. zu laden:
      EDIT: Ich habe hier nur beim Reload-Code etwas verändert. Und zwar, dass die Liste nach zuletzt geöffnetem Datum geordnet wird und dass im Reload-Code überprüft wird, dass nicht mehr wie maxFiles Dateien in der Listbox angezeigt werden.

      VB.NET-Quellcode

      1. Private Sub Reload()
      2. 'Die Einträge des Datasets leeren
      3. LastFiles.Clear()
      4. 'Die FileInfo-Liste leeren
      5. Files.Clear()
      6. 'Wenn die Datei existiert, wird die XML-Datei ausgelesen und dem Dataset die Werte zugewiesen
      7. If _Datafile.Exists Then LastFiles.ReadXml(_Datafile.FullName)
      8. 'Der FileInfo-Liste, werden die Pfade aus der XML-Datei hinzugefügt und als LastAccessTime wird das zuletzt geöffnete Datum der Datei gesetzt
      9. Dim lf = From rwFile In LastFiles.Files Order By rwFile.Datum Descending Take maxFiles Select New FileInfo(rwFile.Dateipfad) With {.LastAccessTime = rwFile.Datum}
      10. Files.AddRange(lf)
      11. 'Die Listbox mit der Files-Liste verbinden
      12. ListBox1.DataSource = Files
      13. 'In Listbox nur den Namen der Dateien anzeigen
      14. ListBox1.DisplayMember = "Name"
      15. End Sub
      16. Private Sub Save()
      17. Me.Validate()
      18. LastFiles.WriteXml(_Datafile.FullName)
      19. End Sub

      Hier der Code, um einen Dateipfad in den DataTabled zu schreiben und die Anzahl zu verändern:
      EDIT: Der Code war wirklich ziemlicher Crap und auch viel zu lang :whistling:. Ich habe ihn jetzt verbessert. Falls es immer noch Verbesserungsvorschläge gibt einfach posten :)

      VB.NET-Quellcode

      1. Private Sub AddFileToLastFilesList(ByVal FilePath As String)
      2. Dim rwLastFile = LastFiles.Files.FirstOrDefault(Function(r) r.Dateipfad = FilePath)
      3. If rwLastFile Is Nothing Then
      4. LastFiles.Files.AddFilesRow(FilePath, Now, 1)
      5. Else
      6. rwLastFile.Anzahl += 1
      7. rwLastFile.Datum = Now
      8. End If
      9. Save()
      10. End Sub

      In den FormLoad-Event schreiben wir dann noch:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      2. Reload()
      3. End Sub

      In den ButtonClick-Code muss noch folgender Code hinien, damit man der Dateiliste mit den zuletzt geöffneten Dateien neue Dateien hinzufügen kann:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      2. Using ofd As New OpenFileDialog
      3. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      4. AddFileToList(ofd.FileName)
      5. Process.Start(ofd.FileName)
      6. End If
      7. End Using
      8. End Sub

      Hier noch der Code der kompletten Klasse

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.IO
      3. Public Class Form1
      4. Private _Datafile As New FileInfo("LastFiles.xml")
      5. Private Files As New List(Of FileInfo)
      6. Const maxFiles As Integer = 5
      7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      8. Using ofd As New OpenFileDialog
      9. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      10. AddFileToLastFilesList(ofd.FileName)
      11. 'Process.Start(ofd.FileName)
      12. End If
      13. End Using
      14. End Sub
      15. Private Sub AddFileToLastFilesList(ByVal FilePath As String)
      16. 'Übeprüfen, ob die Datei bereits im DataTable vorhanden ist
      17. If LastFiles.Files.Any(Function(r) r.Dateipfad = FilePath) Then
      18. 'Wenn ja wird die Zeile mit dem neuen Dateipfad gesucht und die Werte verändert
      19. For Each rw In LastFiles.Files
      20. If rw.Dateipfad = FilePath Then
      21. rw.Anzahl += 1
      22. rw.Datum = Now
      23. End If
      24. Next
      25. Else
      26. 'Wenn nicht wird dem Dataset eine neue Zeile hinzugefügt
      27. LastFiles.Files.AddFilesRow(FilePath, Now, 1)
      28. End If
      29. Save()
      30. End Sub
      31. Private Sub Reload()
      32. 'Die Einträge des Datasets
      33. LastFiles.Clear()
      34. 'Die FileInfo-Liste leeren
      35. Files.Clear()
      36. 'Wenn die Datei existiert, wird die XML-Datei ausgelesen und dem Dataset die Werte zugewiesen
      37. If _Datafile.Exists Then LastFiles.ReadXml(_Datafile.FullName)
      38. 'Der FileInfo-Liste, werden die Pfade aus der XML-Datei hinzugefügt und als LastAccessTime wird das zuletzt geöffnete Datum der Datei gesetzt
      39. For Each rw In LastFiles.Files
      40. Dim fi As New FileInfo(rw.Dateipfad) With {.LastAccessTime = rw.Datum}
      41. Files.Add(fi)
      42. Next
      43. 'Die Liste wird nachdem Datum sortiert
      44. Files.Sort(New System.Comparison(Of FileInfo)(Function(fi1 As FileInfo, fi2 As FileInfo) fi2.LastAccessTime.CompareTo(fi1.LastAccessTime)))
      45. 'So lange Einträge löschen bis die Liste nur noch maxFiles oder weniger Einträge beinhaltet
      46. Do Until Files.Count <= maxFiles
      47. Files.RemoveAt(Files.Count - 1)
      48. Loop
      49. 'Die Listbox mit der Files-Liste verbinden
      50. ListBox1.DataSource = Files
      51. 'In Listbox nur den Namen der Dateien anzeigen
      52. ListBox1.DisplayMember = "Name"
      53. End Sub
      54. Private Sub Save()
      55. Me.Validate()
      56. LastFiles.WriteXml(_Datafile.FullName)
      57. End Sub
      58. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      59. Reload()
      60. End Sub
      61. Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
      62. Process.Start(ListBox1.SelectedItem.ToString)
      63. End Sub
      64. End Class


      Das wars dann auch schon. Falls ihr noch Ideen für weitere Varianten außer DataSet, Registry und Textdatei, dann antwortet diese bitte oder schreibt sie mir per PN. Auch Hinweise auf schlechten Code oder zu komplizierten Code wären sehr hilfreich für mich. :)

      Gruß
      Switcherlapp97
      Bilder
      • TDS1.png

        2,62 kB, 152×89, 1.889 mal angesehen
      • TDS2.png

        109,35 kB, 1.920×950, 187 mal angesehen
      RubiksCubeSolver


      Jetzt im Showroom

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Switcherlapp97“ () aus folgendem Grund: Verbesserungen und Vereinfachungen des Codes

      Ich halte es für merkwürdig, dass es da kein .NET-Konzept vorrätig gibt.
      Unter C++ mit der MFC wurde bei der Projekt-Erstellung einer Document-View-Applikation gefragt, wieviele Einträge zuletzt geöffneter Dateien berücksichtigt werden sollen, maximum war da wohl 16. Und feddich.
      Allerdings wurden diese Einträge halt in der Registry abgelegt.
      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 mir das jetzt nochmal durchgelesen.
      Jetzt wäre noch ein Tut mit Serialisierung gut, da es einfach eine nützliche Funktion ist und einfach gut funktioniert!
      Noch was unwichtiges: Wenn du vielleicht nochmal was mit ner anderen Klasse machst, dann könntest du die Variablen gleich als "Public" deklarieren, damit du sie dort gleich wieder verwenden kannst.
      Ansonsten sieht das echt gut aus!
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      Zuletzt geöffnete Dateien Teil 3 - XML Serialisierung

      Hallo,

      In diesem Thread geht es hauptsächlich, um Daten zu laden, speichern und verarbeiten, verpackt in einem Beispiel zu den zuletzt geöffneten Dateien. Eine weitere Möglichkeit ist die Serialisierung (Danke an @Trade für die Idee). Die Serialisierung kann ein im Speicher befindliches Objekt in ein bestimmtes Format konvertieren und in einer Datei auf der Festplatte schreiben. Dieses Objekt in der Datei in sein ursprüngliches Format zurückkonvertiert werden. Es gibt 3 Serialisierungsverfahren. Ich verwende die XML-Serialisierung. Diese Methode ist etwas aufwendiger zu programmieren, dafür aber plattformunabhängig.

      Nun wieder das Beispiel mit den zuletzt geöffneten Dateien. Wir legen zwei Klassen an. Eine Klasse für eine Datei in der der Dateipfad, der Zeitpunkt an dem die Datei zuletzt geöffnet wurde und wie oft diese Datei schon geöffnet wurde. Hier der Code:
      EDIT: Danke an @RodFromGermany für das Feedback. Ich habs nun verbessert :)

      VB.NET-Quellcode

      1. Public Class Datei
      2. Public Property Datum As Date
      3. Public Property Anzahl As Integer
      4. Public Property Fileinfo As String
      5. End Class

      Die zweite Klasse ist für die zuletzt geöffneten Dateien. Diese Klasse enthält eine Property, die die Liste der zuletzt geöffneten Dateien beinhaltet:

      VB.NET-Quellcode

      1. Public Class LastFiles
      2. Public Property Files As List(Of Datei)
      3. Public Property maxFiles As Integer = 5
      4. End Class

      Zwei Variable brauchen wir noch. Eine um den Namen der XML-File zu speichern und eine um die LastFiles zu speichern:

      VB.NET-Quellcode

      1. Private _Datafile As New FileInfo("LastFiles.xml")
      2. Private _LastFiles As New LastFiles With {.maxFiles = 5}

      Unsere Form hat wie in den vorherigen Posts wieder einen Button (Button1) und eine Listbox(Listbox1). Zusätzlich brauchen wir noch zwei Imports:

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.IO
      3. Imports System.Xml.Serialization

      Nun brauchen wir noch zwei Subs, um die Daten serialisieren und um die Infos wieder deserialisieren (Dieser Code kommt in die LastFiles-Class):

      VB.NET-Quellcode

      1. Private Sub SerializeToXML(ByVal LFs As LastFiles, ByVal XmlPath As String)
      2. With New XmlSerializer(LFs.GetType)
      3. Using writeStream As New StreamWriter(XmlPath)
      4. .Serialize(writeStream, LFs)
      5. End Using
      6. End With
      7. End Sub
      8. Private Function DeserializeFromXML(ByVal XmlPath As String) As LastFiles
      9. Dim LFs As New LastFiles
      10. If File.Exists(XmlPath) Then
      11. With New XmlSerializer(LFs.GetType)
      12. Using readStream As New StreamReader(XmlPath)
      13. LFs = CType(.Deserialize(readStream), LastFiles)
      14. End Using
      15. End With
      16. End If
      17. Return LFs
      18. End Function

      Nun der Code um eine neue Datei den zuletzt geöffneten Dateien hinzufügen kann und anschließend die Informationen mit dem XML-Serializer zu serialisieren (auch in der LastFiles-Klasse):

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Fügt der Zuletzt-geöffneten-Dateien-Liste eine neu Datei hinzu
      3. ''' </summary>
      4. ''' <param name="FilePath">Dateipfad der Datei, die hinzugefügt werden soll</param>
      5. ''' <param name="XmlPath">Pfad der XML-Datei, in der die Informationen gespeichert werden</param>
      6. ''' <remarks></remarks>
      7. Public Sub AddFileToList(ByVal FilePath As String, ByVal XmlPath As String)
      8. 'Alte LastFiles-Liste aus der XML-Datei
      9. Dim LastFiles As LastFiles = Me.DeserializeFromXML(XmlPath)
      10. 'Neue LastFiles-Liste (ist nötig, da in einer Schleife keine Items aus einer Liste gelöscht werden dürfen und damit die Datei, die hinzugefügt werden will, beim nächsten Start der erste Eintrag in der Liste ist
      11. Dim NewLastFiles As New LastFiles
      12. 'Der neuen Liste die neue Datei als ersten Eintrag hinzufügen
      13. NewLastFiles.Files.Add(New Datei With {.Anzahl = 1, .Datum = Now, .Fileinfo = FilePath})
      14. 'Alle Dateien in der alten Liste
      15. For Each File As Datei In LastFiles.Files
      16. 'Wenn die Datei den selben Pfad hat, wie die neue Datei wird beim bereits vorhandenen Eintrag in der neuen Liste die Anzahl um 1 erhöht
      17. 'Dafür wird diese Datei nicht mehr hizugefügt, damit nicht zwei selbe Dateien in der Liste vorhanden sind
      18. If File.Fileinfo = FilePath Then
      19. NewLastFiles.Files(0).Anzahl += 1
      20. Else
      21. 'Sonst wird der neuen Liste die Datei aus der alten Liste hinzugefügt
      22. NewLastFiles.Files.Add(File)
      23. End If
      24. 'Wenn die neue Liste 5 Einträge hat wird die Schleife verlassen
      25. If NewLastFiles.Files.Count = maxFiles Then Exit For
      26. Next
      27. 'Die neue LastFiles-Liste serialisieren
      28. Me.SerializeToXML(NewLastFiles, XmlPath)
      29. End Sub

      Hier noch die Funktion, die die zuletzt geöffneten Dateien returnt (auch in der LastFiles-Klasse):

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Liest die Informationen aus der XML-Datei aus und schreibt sie in eine List(Of FileInfo)
      3. ''' </summary>
      4. ''' <param name="XmlPath">Pfad der XML-Datei, aus der die Informationen gelesen werden</param>
      5. Public Function GetLastFiles(ByVal XmlPath As String) As List(Of FileInfo)
      6. Dim LFs As New List(Of FileInfo)
      7. 'Aus der XML-Datei die Informationen holen
      8. Dim LF As LastFiles = Me.DeserializeFromXML(XmlPath)
      9. 'Die Files in der XML durchgehen und der FileInfo List hinzufügen
      10. For Each F As Datei In LF.Files
      11. LFs.Add(New FileInfo(F.Fileinfo))
      12. Next
      13. Return LFs
      14. End Function

      Das führen wir dann im Form-Load Event aus:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      2. 'Die Dateien aus der XML einer FileInfo-Liste hinzufügen
      3. Dim FileInfos As List(Of FileInfo) = _LastFiles.GetLastFiles(_Datafile.FullName)
      4. 'Die FileInfosList an die Listbox binden
      5. ListBox1.DataSource = FileInfos
      6. 'Den Namen der Datei in der FileInfo-Liste in der Listbox anzeigen
      7. ListBox1.DisplayMember = "Name"
      8. End Sub

      In den ButtonClick-Code muss noch folgender Code hinien, damit man der Dateiliste mit den zuletzt geöffneten Dateien neue Dateien hinzufügen kann:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      2. Using ofd As New OpenFileDialog
      3. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      4. AddFileToList(ofd.FileName)
      5. Process.Start(ofd.FileName)
      6. End If
      7. End Using
      8. End Sub

      Und jetzt noch der Code für den Listbox-DoubleClick-Event:

      VB.NET-Quellcode

      1. Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
      2. If Not ListBox1.SelectedItems.Count = 0 Then
      3. _LastFiles.AddFileToList(ListBox1.SelectedItem.ToString, _Datafile.FullName)
      4. Process.Start(ListBox1.SelectedItem.ToString)
      5. End If
      6. End Sub

      Der komplette Code

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.IO
      3. Imports System.Xml.Serialization
      4. Public Class Form1
      5. Private _Datafile As New FileInfo("LastFiles.xml")
      6. Private _LastFiles As New LastFiles With {.maxFiles = 5}
      7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      8. Using ofd As New OpenFileDialog
      9. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
      10. 'Ausgewählte Datei in XML schreiben
      11. _LastFiles.AddFileToList(ofd.FileName, _Datafile.FullName)
      12. 'Datei öffnen
      13. Process.Start(ofd.FileName)
      14. End If
      15. End Using
      16. End Sub
      17. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      18. 'Die Dateien aus der XML einer FileInfo-Liste hinzufügen
      19. Dim FileInfos As List(Of FileInfo) = _LastFiles.GetLastFiles(_Datafile.FullName)
      20. 'Die FileInfosList an die Listbox binden
      21. ListBox1.DataSource = FileInfos
      22. 'Den Namen der Datei in der FileInfo-Liste in der Listbox anzeigen
      23. ListBox1.DisplayMember = "Name"
      24. End Sub
      25. Private Sub ListBox1_DoubleClick(sender As Object, e As System.EventArgs) Handles ListBox1.DoubleClick
      26. If Not ListBox1.SelectedItems.Count = 0 Then
      27. _LastFiles.AddFileToList(ListBox1.SelectedItem.ToString, _Datafile.FullName)
      28. Process.Start(ListBox1.SelectedItem.ToString)
      29. End If
      30. End Sub
      31. End Class
      32. Public Class LastFiles
      33. Public Property Files As New List(Of Datei)
      34. Public Property maxFiles As Integer = 5
      35. Private Sub SerializeToXML(ByVal LFs As LastFiles, ByVal XmlPath As String)
      36. With New XmlSerializer(LFs.GetType)
      37. Using writeStream As New StreamWriter(XmlPath)
      38. .Serialize(writeStream, LFs)
      39. End Using
      40. End With
      41. End Sub
      42. Private Function DeserializeFromXML(ByVal XmlPath As String) As LastFiles
      43. Dim LFs As New LastFiles
      44. If File.Exists(XmlPath) Then
      45. With New XmlSerializer(LFs.GetType)
      46. Using readStream As New StreamReader(XmlPath)
      47. LFs = CType(.Deserialize(readStream), LastFiles)
      48. End Using
      49. End With
      50. End If
      51. Return LFs
      52. End Function
      53. ''' <summary>
      54. ''' Fügt der Zuletzt-geöffneten-Dateien-Liste eine neu Datei hinzu
      55. ''' </summary>
      56. ''' <param name="FilePath">Dateipfad der Datei, die hinzugefügt werden soll</param>
      57. ''' <param name="XmlPath">Pfad der XML-Datei, in der die Informationen gespeichert werden</param>
      58. ''' <remarks></remarks>
      59. Public Sub AddFileToList(ByVal FilePath As String, ByVal XmlPath As String)
      60. 'Alte LastFiles-Liste aus der XML-Datei
      61. Dim LastFiles As LastFiles = Me.DeserializeFromXML(XmlPath)
      62. 'Neue LastFiles-Liste (ist nötig, da in einer Schleife keine Items aus einer Liste gelöscht werden dürfen und damit die Datei, die hinzugefügt werden soll, beim nächsten Start der erste Eintrag in der Liste ist
      63. Dim NewLastFiles As New LastFiles
      64. 'Der neuen Liste die neue Datei als ersten Eintrag hinzufügen
      65. NewLastFiles.Files.Add(New Datei With {.Anzahl = 1, .Datum = Now, .Fileinfo = FilePath})
      66. 'Alle Dateien in der alten Liste
      67. For Each File As Datei In LastFiles.Files
      68. 'Wenn die Datei den selben Pfad hat, wie die neue Datei wird beim bereits vorhandenen Eintrag in der neuen Liste die Anzahl um 1 erhöht
      69. 'Dafür wird diese Datei nicht mehr hizugefügt, damit nicht zwei selbe Dateien in der Liste vorhanden sind
      70. If File.Fileinfo = FilePath Then
      71. NewLastFiles.Files(0).Anzahl += 1
      72. Else
      73. 'Sonst wird der neuen Liste die Datei aus der alten Liste hinzugefügt
      74. NewLastFiles.Files.Add(File)
      75. End If
      76. 'Wenn die neue Liste 5 Einträge hat wird die Schleife verlassen
      77. If NewLastFiles.Files.Count = maxFiles Then Exit For
      78. Next
      79. 'Die neue LastFiles-Liste serialisieren
      80. Me.SerializeToXML(NewLastFiles, XmlPath)
      81. End Sub
      82. ''' <summary>
      83. ''' Liest die Informationen aus der XML-Datei aus und schreibt sie in eine List(Of FileInfo)
      84. ''' </summary>
      85. ''' <param name="XmlPath">Pfad der XML-Datei, aus der die Informationen gelesen werden</param>
      86. Public Function GetLastFiles(ByVal XmlPath As String) As List(Of FileInfo)
      87. Dim LFs As New List(Of FileInfo)
      88. 'Aus der XML-Datei die Informationen holen
      89. Dim LF As LastFiles = Me.DeserializeFromXML(XmlPath)
      90. 'Die Files in der XML durchgehen und der FileInfo List hinzufügen
      91. For Each F As Datei In LF.Files
      92. LFs.Add(New FileInfo(F.Fileinfo))
      93. Next
      94. Return LFs
      95. End Function
      96. End Class
      97. Public Class Datei
      98. Public Property Datum As Date
      99. Public Property Anzahl As Integer
      100. Public Property Fileinfo As String
      101. End Class


      Das wars dann auch schon. Falls ihr noch Ideen für weitere Varianten habt teilt mir das bitte mit. Auch Hinweise auf schlechten Code oder zu komplizierten Code wären sehr hilfreich für mich. :)

      Gruß
      Switcherlapp97
      RubiksCubeSolver


      Jetzt im Showroom

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Switcherlapp97“ () aus folgendem Grund: Verbesserungen

      Switcherlapp97 schrieb:

      Die zweite Klasse ist für die zuletzt geöffneten Dateien. Diese Klasse enthält eine Property, die die Liste der zuletzt geöffneten Dateien beinhaltet
      Was soll das?
      Diese Klasse schreit doch danach, die Serialisation und die Deserialisation mit aufzunehmen. So könntest Du diese Klasse sogar in eine DLL packen und anderen Usern zur Verfügung stellen. Parameter: XmlPath As String, als Properties die FileInfo-Liste.
      -----
      So etwa:

      VB.NET-Quellcode

      1. Public Class LastFiles
      2. Public Property Files As List(Of Datei)
      3. Public Sub SerializeToXML(XmlPath As String)
      4. ' ...
      5. End Sub
      6. Public Sub DeserializeToXML(XmlPath As String)
      7. ' ...
      8. End Sub
      9. 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!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

      Zuletzt geöffnete Dateien Teil 4 - Beispielprojekt und Sources

      Hallo,

      EDIT: Ich lösche die DLL und den zugehörigen Beitrag, da eine DLL in einem Tutorial eigentlich keinen Sinn macht. Aus einer DLL kann man nix lernen. Stattdessen lade ich hier Beispielprojekte und die Sources für die einzelnen Methoden hoch. Falls jemand doch Interesse hat an der DLL (was ich nicht glaube :)) kann man mich per PN anschreiben.

      @RodFromGermany
      Ich habe nun den Code der XML-Serialisierung noch abgeändert. Nochmals Danke für deine Rückmeldung :)

      @All
      Ich bedanke mich für die bisherigen Rückmeldungen und Feedbacks. Ihr habt mir echt geholfen meine Programmierkünste zu verbessern :D
      Weitere Vorschläge, für Möglichkeiten der Datenverarbeitung sind erwünscht. Genauso wie Kritik und Feedback zu meinem bisherigen Code.

      Gruß
      Switcherlapp97
      Dateien
      RubiksCubeSolver


      Jetzt im Showroom

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Switcherlapp97“ ()