IniLib - 08.11.2011

    • VB.NET

    Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

      IniLib - 08.11.2011

      Name des Programms
      IniLib

      Beschreibung
      Als Nachfolger der IniLib 1.0 übernimmt diese Programmbibliothek das Arbeiten mit Initialisierungsdateien (.ini-Dateien). Neben einfachen Funktionalitäten, wie das bearbeiten der einzelnen Strukturelemente einer Initialisierungsdatei wird auch ein gepuffertes Laden von Dateien, Streams und anderen Datenquellen (z.B. Strings) geboten. Diese können bei Bedarf ergänzt werden. Ferner können Dateitypen, die ähnlich aufgebaut sind, wie Initialisierungsdateien, bearbeitet werden (siehe Programmanleitung).
      In der IniLib 2.0 wurde das Konzept der alten IniLib komplett neu überarbeitet. Die alte IniLib finden Sie hier. Allerdings empfehle ich, diese aufgrund einiger Fehler nicht weiter zu verwenden.

      Verwendete Programmiersprache
      Visual Basic .NET (Entwicklungsumgebung: Visual Basic 2010 Express)

      Systemanforderungen
      .NET Framework 2.0

      Download

      IniLib 2.3.zip(Komprimierte Datengröße: 32,4 KB, Datengröße: 142 KB)
      - IniLib Programmbibliothek (IniLibCore.dll, Dateigröße: 58,5 KB)
      - Dokumentation englisch (IniLibCore.xml, Dateigröße: 83,5 KB)

      IniLibCore Sourcecode.zip(Komprimierte Datengröße: 41,2 KB, Datengröße: 272 KB)
      - IniLib Sourcecode (Mehrere Dateien, Datengröße 272 KB)

      Hinweise
      - Schlüssel-Wert-Paare (bzw. Key-Value pairs) haben im Englischen eigentlich die Bezeichnung "Property"

      Weitergabe
      Dieses Produkt und sämtliche mitgelieferte oder optionale Komponenten dürfen nicht durch andere unter deren Namen zum Download angeboten werden. Die Verbreitung der IniLib mit Programmen, die auf ihrem Quellcode (d.h. die Programmbibliothek wird nicht mitgeliefert) basieren, ist gestattet, hat aber für den jeweiligen Anwendungsentwickler zur Folge, dass der Name des Entwicklers der IniLib offensichtlich zu machen ist. Hierbei soll die Quelle (vb-paradise.de), der Entwicklername (~blaze~) und der Produktname (IniLib) genannt werden. Eine Namensnennung ist nicht erforderlich, wenn die Programmbibliothek dem Programm beiliegt.
      Dekompilieren des Programms oder jeglicher mitgelieferter oder optionaler Komponenten, deren Sourcecode nicht zum Download geboten und explizit als solcher gekennzeichnet wurde, ist strikt verboten und wird zur Anzeige gebracht.

      Inhalt

      Inhaltsverzeichnis
      1. Management von Initialisierungsdateien
      1.1 Initialisierungsdateien, Sektionen und Schlüssel-Wert-Paare
      1.2 Laden und Speichern von Initialisierungsdaten
      1.3 Konfigurationsmöglichkeiten
      1.4 Leerzeilen und Kommentarzeilen
      1.5 Informationen zur Auswertung von Initialisierungsdateien
      1.6 Serialisierung mithilfe der IniFileSerializer-Klasse
      2. Codeschnippsel
      2.1 Laden, Verändern und Speichern von Einstellungen
      2.2 Ausgabe in Xml-Dokumenten unter Verwendung der System.Xml-Frameworkkomponente
      [expander=Anleitung zur Verwendung]

      1. Management von Initialisierungsdateien
      1.1 Initialisierungsdateien, Sektionen und Schlüssel-Wert-Paare

      Generell wurde die Bearbeitung von Initialisierungsdaten durch die IniFile-Klasse implementiert. Eine Instanz der IniFile-Klasse erzeugen Sie wie folgt:

      VB.NET-Quellcode

      1. Dim iniFileInstance As New IniFile()

      Optional können Sie noch einige Parameter übergeben, die das Verhalten der Klasse und deren Funktionalität modifizieren. So können Sie bereits im Konstruktor eine Datei laden. Dies erzielt die gleiche Wirkung, wie ein Laden mithilfe der LoadFile(String)-Methode.
      Die IniFile-Klasse unterstützt neben Dateien auch Streams und Strings und kann durch von der IniTextReader-Klasse erbende Klassen ergänzt werden. Rufen Sie hierzu eine passende Überladung der LoadStream- oder LoadText-Methode auf (Eine Beschreibung können Sie der Dokumentation entnehmen). Die IniFile-Klasse selbst stellt die oberste Ebene der Initialisierungsdatei dar. Innerhalb von ihr werden Sektionen abgelegt, die wiederum Schlüssel-Wert-Paare enthalten können. Sowohl Sektionsköpfe, als auch Schlüssel-Wert-Paare können mit Kommentaren versehen werden. Sektionen können durch die IniFileSection-Klasse verwaltet werden. Hierbei steht die beinhaltende IniFile-Klasseninstanz bereits bei der Erstellung der Instanz fest. Allerdings sind sie zu diesem Zeitpunkt noch nicht Teil des Inhalts, weshalb Sie sie dazu noch der durch die Sections-Eigenschaft der IniFile-Instanz gebotenen Auflistung hinzufügen müssen. Dies geschieht wie folgt:

      VB.NET-Quellcode

      1. Dim mySection As New IniSection(iniFileInstance, "mySection")
      2. iniFileInstance.Sections.Add(mySection)

      Neben dem oben verwendeten Konstruktor, der eine Instanz der IniSection-Klasse mit dem Sektionsnamen (Section name) "mySection" erzeugt, gibt es noch Überladungen für Sektionen, die einen Kommentar (Comment) oder Schlüssel-Wert-Paare enthalten. Auf den Sektionsnamen können Sie über die SectionName-Eigenschaft der IniSection-Klasseninstanz zugreifen, auf den Kommentar über die Comment-Eigenschaft. Schlüssel-Wert-Paare können Sie hinzufügen, indem Sie der durch die KeyValues-Eigenschaft gebotenen Auflistung Instanzen der IniFileKeyValuePair-Klasse hinzufügen. Für die Instanzierung der IniFileKeyValuePair-Klasse gibt es jeweilige Konstruktoren, die den Schlüssel (Key), den Wert (Value) oder den Kommentar (Comment) festlegen. Auf diese Werte kann durch die gleich heißenden Eigenschaften zugegriffen werden. Außerdem kann eine Instanz von einer bereits bestehenden Instanz der IniKeyValuePairDescription-Klasse erzeugt werden. Diese Klasse stellt eine Basis für andere Schlüssel-Wert-Paare dar, die nicht durch diese Programmbibliothek verwaltet werden. Auch IniFileKeyValuePair erbt von dieser Klasse. Schlüssel-Wert-Paare können nur einer einzigen Sektion hinzugefügt werden, dieser aber unter Umständen mehrfach (siehe 1.3 Konfigurationsmöglichkeiten).
      Folgendes Codebeispiel fügt der im obigen Code erzeugten Sektion eine neue Instanz der IniFileKeyValuePair-Klassed hinzu:

      VB.NET-Quellcode

      1. Dim keyValuePair As New IniFileKeyValuePair("key", "value")
      2. mySection.KeyValues.Add(keyValuePair)


      Die Verwaltung der Auflistungen von Sektionen in IniFile-Klasseninstanzen und Schlüssel-Wert-Paaren in IniFileSection-Klasseninstanzen erfolgen gleich, wie in anderen Auflistungen, die die IList(Of T)-Schnittstelle implementieren. So können Sie mit Add Einträge hinzufügen und mit Remove entfernen. Mit IndexOf können Sie den Index eines hinzugefügten Eintrags ermitteln und mit der Item-Eigenschaft auf den Wert am jeweiligen Index zugreifen. Mit Contains überprüfen Sie, ob der Wert in der Auflistung enthalten ist.

      1.2 Laden und Speichern von Initialisierungsdaten
      Es gibt viele mögliche Quellen, aus denen Sie Initialisierungsdateien laden könnten. So wurde in der IniFile-Klasse die Möglichkeit implementiert, Daten aus Streams oder aus von Ihnen programmierten Operationen zu erstellen. Die folgenden Methoden können Sie verwenden, um Daten zu laden:
      - LoadFile lädt Dateien
      - LoadStream lädt Daten aus Streams
      - LoadText lädt Daten aus Strings
      - Load lädt Daten aus von Ihnen programmierten Quellen

      Der Parameter keepPrevious gibt hierbei an, ob der vorher geladene Inhalt weiter verfügbar sein soll oder ob die geladene Initialisierungsdatei geleert werden soll. Standardmäßig werden die Daten beibehalten. Der Parameter encoding gibt die Zeichencodierung an, in der die Daten vorliegen. Als Standardwert wird die Zeichencodierung verwendet, die die System.Text.Encoding.Default-Eigenschaft angibt. Für Daten, die als Strings vorliegen wird außerdem die Möglichkeit angeboten, die Größe des in der Methode verwendeten Stringpuffers direkt anzugeben. Diesen Parameter sollten Sie verwenden, wenn Sie wissen, dass Schlüssel, Werte, Kommentare oder Sektionsnamen eine bestimmte Länge nicht überschreiten. Ansonsten muss bei einer unzureichenden Puffergröße weiterer Speicher allokiert werden, was sich performancelastig auswirkt.

      Die folgenden Methoden können Sie verwenden, um Daten zu speichern:
      - ToString gibt die vollständie Initialisierungsdatei als String zurück
      - Save(String) und Save(String, Encoding) können Sie verwenden, um die Initialisierungsdatei in eine Datei zu speichern
      - Save(Stream) und Save(Stream, Encoding) können Sie verwenden, um die Initialisierungsdatei in einen Stream zu speichern
      - Save(IniTextWriter) können Sie verwenden, um die Initialisierungsdatei in ein von Ihnen programmiertes Ziel zu speichern
      Der encoding-Parameter steht für die zu verwendende Zeichencodierung mit dem Standardwert, der von der System.Text.Encoding.Default-Eigenschaft zurückgegeben wird.

      Die abstrakten IniTextReader- und IniTextWriter-Klassen wurden nur zu einer möglichen Steigerung der Effizienz in dieser Art implementiert. Da verschiedene Datenquellen nicht auf Streams optimiert sind oder auf sonst ausgeführte, effizienzlastige Konversionen zugreifen müssen, die wieder zum gleichen Resultat führen, wurden die beiden Klassen so angelegt, dass nur die grundlegenden Methoden überschrieben werden müssen. Außerdem können weitere Methoden und Eigenschaften überschrieben werden, die für Ihren Fall optimierter programmierbar sind. Zudem können Sie das Verhalten in bestimmten Fällen verändern oder andere Dateitypen implementieren, deren Struktur ähnlich der von Initialisierungsdateien ist. Letzteres können Sie aber auch eingeschränkter durch ein Überschreiben der IniFile-Klasse erreichen. Das Lesen und Schreiben von Streams wurde auch in dieser Art implementiert. Weitere Informationen können Sie den Beschreibungen der jeweiligen Mitglieder entnehmen.

      1.3 Konfigurationsmöglichkeiten
      Durch das Übergeben von IniLib.IniFileFlags-Flaggen an den Konstruktor der IniFile-Klasse können Sie das Verhalten der IniFile und von IniFileSections verändern. In normalen Initialisierungsdateien ist es beispielsweise nicht gestattet, dass mehrere Sektionen den gleichen Namen oder mehrere Schlüssel-Wert-Paare innerhalb einer Sektion den gleichen Schlüssel haben. Durch das Übergeben der IniLib.IniFileFlags.SupportsSectionNameRepetition-Flagge können Sie die Wiederholung von Sektionsnamen innerhalb einer Datei und der IniLib.IniFileFlags.SupportsKeyValuePairKeyRepetition-Flagge die Wiederholung von Schlüssel-Wert-Paaren innerhalb einer Sektion erlauben. Die IniLib.IniFileFlags.CaseInsensitive-Flagge gibt an, dass die Groß-und Kleinschreibung bei der Auswahl von Sektionen und Schlüsseln nicht berücksichtigt werden soll. Beim Vergleichen von Strings wird bei einer Übergabe der Flagge ein kulturunabhängiger (invarianter) Vergleich durchgeführt.
      Neben den Flaggen können Sie auch eine Klasse von der IniFile-Klasse ableiten. Hierbei können Sie das Trennzeichen für Schlüssel-Wert-Paare oder auch das Kommentarzeichen festlegen.

      1.4 Leerzeilen und Kommentarzeilen
      Initialisierungsdateien können auch Leerzeilen oder Kommentarzeilen enthalten. Diese Spezialfälle wurden durch spezielle Werte von Sektionsnamen, Schlüsseln und Kommentaren umgesetzt:
      - Ist ein Sektionsname Nothing (Null) oder leer, so ist er nicht sichtbar
      - Ist ein Sekitionskommentar nicht Nothing (Null), so ist er sichtbar
      - Ist ein Key Nothing (Null) oder leer, so ist das Schlüssel-Wert-Paar nicht sichtbar
      - Ist der Kommentar eines Schlüssel-Wert-Paars nicht Nothing (Null), so ist er sichtbar

      Innerhalb von Sektionen, deren Sektionsname nicht sichtbar ist, dürfen nur Kommentare und Leerzeichen enthalten sein. Die Werte von Schlüssel-Wert-Paaren sind nicht sichtbar, wenn der Schlüssel nicht sichtbar ist.
      Innerhalb einer Auflistung werden Sektionen ohne Namen ebenfalls mit Nothing (Null) bzw. einem leeren String angesprochen. Dieser Wert muss aber mit dem Sektionsnamen übereinstimmen (Nothing (Null) spricht einen Sektionsnamen mit Nothing (Null), ein leerer String einen Sektionsnamen, der leer ist, an).

      1.5 Informationen zur Auswertung von Initialisierungsdateien
      Wie aus Kapitel 1.4 hervorgeht, können Leerzeilen und Kommentarzeilen auf unterschiedliche Weise erstellt werden. So können Sie zur Laufzeit eine Sektion, deren Sektionsname nicht sichtbar ist, auf eine andere Sektion folgen lassen. Diese Kombination ist zulässig und wird auch korrekt gespeichert. Allerdings ist das Ergebnis nach dem Laden anders, als beim Speichern, da Kommentarzeilen als Teil der vorherigen Sektion angesehen wird. Wenn eine Initialisierungsdatei mit einer Kopfzeile beginnt, wird eine neue Sektion angelegt. Alle nachfolgenden Kommentarzeilen werden dieser Sektion angefügt. Daher wird empfohlen, dass Sie bereits beim Speichern diese Strukturierung berücksichtigen.

      Da es verschiedene Zeilenumsprungskombinationen in unterschiedlichen Systemen gibt, wurde die Stringinterpretation an sie angepasst. Sowohl Carriage Return (Cr, Chr(13)), als auch Line feed (Lf, Chr(10)) werden als Zeilenumsprung behandelt. Aber auch CrLf und LfCr werden als ein einziger Zeilenumsprung interpretiert.

      Ferner werden Sektionsnamen, die mit Leerzeichen beginnen oder enden, nicht untestützt; wenn Leerzeichen vor der öffnenden Klammer ('[') oder nach der schießenden Klammer (']') stehen, werden diese übersprungen. Leerzeichen vor und nach Schlüsseln und Werten werden übersprungen. Kommentare bleiben vollständig erhalten.

      1.6 Serialisierung mithilfe der IniFileSerializer-Klasse
      Sie können seit der Version 2.1 Objekte mithilfe der IniFileSerializer-Klasse der IniLib auch serialisieren. Hierbei wurde das Konzept der Xml-Serialisierung weitgehend aufgenommen. Zur Anwendung müssen Sie erst eine Instanz der IniFileSerializer-Klasse erzeugen (Dies dient der Kompatibilität mit möglichen späteren Versionen, die eine andere Implementierung anbieten, aber auch der Veränderbarkeit interner vererbter Methoden. Diese wird in den meisten Fällen nicht benötigt und deshalb an dieser Stelle weggelassen). Optional können Sie noch das Trennzeichen für die Mitgliedshierarchie festlegen. Dieses wird verwendet, wenn Werte gespeichert werden, die nicht primitiv, NULL (in Visual Basic Nothing) oder ein String sind und ist bei keiner Angabe ein '.'-Zeichen.
      Rufen Sie zur Serialisierung von Objekten die Serialize-Methode mit dem Namen des Objektes, das zu serialisieren ist, dem zu serialisierenden Wert und einer Instanz der IniFile-Klasse auf. Beachten Sie hierbei, dass pro Hierarchieebene eine neue IniFileSection hinzugefügt wird und bestehende Elemente nicht überschrieben werden. Dies ist auch bei der Auswertung von Initialisierungsdateien zu beachten, denn hierbei werden bei mehrfachem Vorkommen immer die ersten Sektionen ausgewählt, deren Sektionsname dem Kriterium entspricht.
      Für die Deserialisierung wird die Deserialize-Methode aufgerufen. Als erster Parameter wird der Name des zu serialisierenden Objekts angegeben, als zweiter die das Objekt beschreibende IniFile-Instanz. Die Funktion gibt das deserialisierte Objekt als Objekt zurück.
      Namen von Objekten können Sie mithilfe der IsValidObjectName-Methode überprüft werden. Hierbei werden entweder die IniFile-Instanz, Trennzeichen für Schlüssel-Wert-Paare und Kommentare benötigt oder die Standardtrennzeichen verwendet. Beispielsweise können Sie die Namen von Feldern oder Eigenschaften verwenden.

      Serialisierte Objekte müssen mit einem System.SerializableAttribute-Attribut versehen werden. Felder und Eigenschaften einer Instanz, bei denen kein NonSerializedAttribute-Attribut angegeben wurde, werden serialisiert, wenn Sie öffentlich und beschreibbar sind. Eigenschaften dürfen außerdem keine Indices haben. Beachten Sie, dass auch Felder und Eigenschaften, für die ein System.ComponentModel.BrowsableAttribute- oder ein System.ComponentModel.EditorBrowsableAttribute-Attribut angegeben wurde, serialisiert werden. Wenn Sie eine eigene Serialisierungsart implementieren möchten, implementieren Sie die ISerializable-Klasse, überschreiben alle angeforderten Methoden und erstellen Sie einen deserialisierenden Konstruktor, der als ersten Parameter die System.Runtime.Serialization.SerializationInfo, aus der Sie die zu serialisierende Daten beziehen können und als zweiten Parameter einen System.Runtime.Serialization.StreamingContext, unter dem die Deserialisierung stattfindet, hat.

      2. Codeschnippsel
      In den Schnippseln wird ein Import des IniLib-Namensraums vorausgesetzt.
      2.1 Laden, Verändern und Speichern von Einstellungen
      Das Beispiel behandelt das Laden, verändern und speichern von Initialisierungsdateien.

      Im Folgenden Codesegment wird eine IniFile-Klasseninstanz verwendet, um die Position und Größe eines Fensters zu laden. Es ist empfehlenswert, die IniFile-Klasseninstanz innerhalb der Klasse abzulegen, da sie dadurch nicht jedes mal erzeugt werden muss.

      VB.NET-Quellcode

      1. Dim ifFile As New IniFile() 'Instanz der IniFile-Klasse erzeugen
      2. ifFile.LoadFile("settings.ini") 'Datei mit Standardzeichencodierung laden
      3. If ifFile.Sections.Count > 0 Then 'Es sind Sektionen verfuegbar
      4. If ifFile.Sections.Contains("MainForm") Then
      5. 'Einstellungen fuer das Hauptfenster laden (Die Instanz der Hauptfenster-Klasse traegt hier den Namen MainForm)
      6. With ifFile.Sections("MainForm")
      7. 'Jeweils ueberpruefen, ob die Eigenschaft enthalten ist (IndexOf ist in diesem Fall effizienter, als Contains*)
      8. Dim index As Integer = .KeyValues.IndexOf("Left")
      9. If index <> -1 Then
      10. 'und gegebenenfalls die Eigenschaft setzen
      11. If Not Integer.TryParse(.KeyValues(index).Value, MainForm.Left) Then
      12. 'Ungueltiger Wert
      13. End If
      14. End If
      15. index = .KeyValues.IndexOf("Top")
      16. If index <> -1 Then
      17. If Not Integer.TryParse(.KeyValues(index).Value, MainForm.Top) Then
      18. 'Ungueltiger Wert
      19. End If
      20. End If
      21. index = .KeyValues.IndexOf("Width")
      22. If index <> -1 Then
      23. If Not Integer.TryParse(.KeyValues(index).Value, MainForm.Width) Then
      24. 'Ungueltiger Wert
      25. End If
      26. End If
      27. index = .KeyValues.IndexOf("Height")
      28. If index <> -1 Then
      29. If Not Integer.TryParse(.KeyValues(index).Value, MainForm.Height) Then
      30. 'Ungueltiger Wert
      31. End If
      32. End If
      33. End With
      34. End If
      35. End If

      * (Effizienz von IndexOf höher, als von Contains): Beim Aufruf von get_Item(String), IndexOf und Contains wird durch die Elemente der Auflistungen durchiteriert und überprüft, ob der Schlüssel übereinstimmt. Bei einer Kombination von get_Item(String) und Contains wird somit zwei mal durch die Schleife gegangen, bei IndexOf nur einmal, was effizienter ist, da die Elemente der Auflistung sequentiell angeordnet sind und sich somit der Zeiger auf das Element der Auflistung aus dem Index berechnen lässt.

      Ungültige Werte sollten mit einem Nachrichtenfenster oder einer anderen Fehlerbehandlung gemeldet werden.

      Im Folgenden Codesegment werden die Informationen der MainForm-Klasseninstanz verändert und anschließend in die Datei zurückgeschrieben.

      VB.NET-Quellcode

      1. Dim ifFile As New IniFile()
      2. 'MainForm-Sektion ermitteln oder erzeugen
      3. Dim section As IniFileSection = ifFile.CreateSection("MainForm")
      4. 'Jeweilige Schluessel-Wert-Paare ermitteln oder erzeugen
      5. section.CreateKeyValuePair("Left", MainForm.Left.ToString())
      6. section.CreateKeyValuePair("Top", MainForm.Top.ToString())
      7. section.CreateKeyValuePair("Width", MainForm.Width.ToString())
      8. section.CreateKeyValuePair("Height", MainForm.Height.ToString())
      9. 'Einstellungen speichern
      10. ifFile.Save("settings.ini")

      2.2 Ausgabe in Xml-Dokumenten unter Verwendung der System.Xml-Frameworkkomponente
      Im Code wird ein Import des System.Xml-Namensraums vorausgesetzt.

      VB.NET-Quellcode

      1. Dim ifFile As New IniFile()
      2. Dim xmlWriter As New XmlTextWriter("settings.xml", Encoding.Default) 'Ausgabe in der aktuellen Zeichencodierung
      3. xmlWriter.WriteStartElement("settings") 'Stammelement oeffnen
      4. For Each section As IniFileSection In ifFile.Sections
      5. If section.IsCommentVisible Then
      6. xmlWriter.WriteComment(section.Comment) 'Kommentar schreiben, falls verfuegbar
      7. End If
      8. If section.IsSectionNameVisible Then
      9. xmlWriter.WriteStartElement(section.SectionName) 'Sektionselement oeffnen, falls verfuegbar
      10. End If
      11. For Each kvp As IniFileKeyValuePair In section.KeyValues
      12. If Not kvp.IsEmpty Then
      13. If kvp.IsCommentVisible Then
      14. xmlWriter.WriteComment(kvp.Comment) 'Kommentar schreiben, falls verfuegbar
      15. End If
      16. If Not kvp.IsComment Then 'Kommentar-Schluessel-Wert-Paare beruecksichtigen
      17. xmlWriter.WriteStartElement("setting") 'Eintrag oeffnen
      18. xmlWriter.WriteAttributeString("key", kvp.Key)
      19. xmlWriter.WriteAttributeString("value", kvp.Value)
      20. xmlWriter.WriteEndElement() 'Eintrag schliessen
      21. End If
      22. End If
      23. Next
      24. If section.IsSectionNameVisible Then
      25. xmlWriter.WriteFullEndElement() 'Sektionselement schliessen
      26. End If
      27. Next
      28. xmlWriter.WriteFullEndElement() 'Stammelement schliessen
      29. xmlWriter.Close()


      Log

      Version 2.3:
      - Werte unterstützen nun auch den '='-Buchstaben (Bug im IniFileSerializer wurde damit behoben, da System.Type.AssemblyQualifiedName ein '=' enthalten kann)
      - Fehlverhalten beim Auslesen von Streams auf Systemen mit CrLf- bzw. LfCr-Zeilenumsprüngen behoben, das zu leeren Schlüssel-Wert-Paaren führte
      Version 2.2:
      - Überarbeitung der IniFileSerializer-Klasse, die nun bereits bestehende Sektionen und Schlüssel-Wert-Paare überschreibt, statt neue anzulegen
      Version 2.1:
      - IniFileSerializer hinzugefügt (Anwendung siehe Anleitung)
      Version 2.0:
      - Die IniLib wurde komplett neu erstellt

      Ich würde mich über Verbesserungsvorschläge, Anregungen und konstruktive Kritik freuen und werde Fragen gerne beantworten. Vielen Dank für den Download und viel Spaß mit der Entwicklung.

      Mit freundlichen Grüßen
      ~blaze~

      Edit by ~blaze~:
      Sourcecode wurde verfügbar gemacht
      --> *Thema aus dem Showroom verschoben*

      Dieser Beitrag wurde bereits 19 mal editiert, zuletzt von „~blaze~“ ()

      Ich habe soeben die Version 2.2 der IniLib zum Download bereitgestellt. Geändert hat sich nur eine Sache: Die IniFileSerializer-Klasse erstellt nun beim Serialisieren keine neuen Sektionen, wenn bereits welche mit dem Namen vorhanden sind, sondern überschreibt bestehende. Hierbei werden die Kommentare und überschüssigen Sektionen und Schlüssel-Wert-Paare beibehalten.
      Ferner habe ich das Inhaltsverzeichnis nun aus dem Expander herausgetan, damit die Übersichtlichkeit gefördert wird. Das Archiv beinhaltet des Weiteren nur Downloads zu Versionen, die von Bugfixes nicht betroffen sind. Beispielsweise wird nur Version 2.0 angeboten, aber nicht Version 2.1, da in Version 2.0 der Serializer noch nicht dabei ist, in Version 2.1 schon und in Version 2.2 der Serializer überarbeitet wurde. Die Version 2.1 wird weiterhin im Log zum Download angeboten (es gibt aber normalerweise keine Fixes mehr für ausgelaufene Versionen).

      Gruß
      ~blaze~

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

      Soeben wurde eine neue Version der IniLib hochgeladen. In Der Version 2.3 wurden folgende Bugs behoben:
      - Beim Laden von Streams wurden die Kombinationen von Zeilenumbrüchen und Schreibkopfrücklauf (Wagenrücklauf)-Buchstaben nicht korrekt interpretiert, wodurch es zu leeren Schlüssel-Wert-Paaren kam
      - Werte dürfen nun '='-Buchstaben enthalten. Schlüssel enden wie gewohnt mit dem ersten '='-Buchstaben. Durch das Verhindern weiterer '='-Buchstaben kam es unter Umständen im IniFileSerializer zu einer Ausnahme, da der den Typ spezifizierenden Wert des .type-Schlüssels einen '='-Buchstaben enthalten konnte

      Da der Fehler bereits bei Version 2.0 vorhanden war, wurde die Version aus dem Archiv entfernt.

      Gruß
      ~blaze~
      Hi
      Als kleines Weihnachtsgeschenk gibts jetzt den Sourcecode der IniLib 2 zum Download. Die IniLib ist aber immernoch im relativ frühen Beta-Stadium, da sich das Testen der Lib sehr in Grenzen gehalten hat. Ihr dürft den Sourcecode natürlich verändern, wie ihr wollt. Bitte macht aber bei einer Verwendung weiterhin die oben genannten Daten sichtbar. Schon mal als Warnung: Der Sourcecode war eigentlich nicht dafür ausgelegt, dass ich ihn hier rauflade. Deshalb ist er auch... darauf basiert, dass ich ihn verstehe (d.h. die Variablenbenennung und Kommentierung ist etwas dürftig). Wer schon mal mit mir im Team programmiert hat, weiß, dass ich sonst augenfreundlicher programmiere. Wenn ihr aber Fragen zu einigen Passagen habt, nehme ich mir aber gerne die Zeit, sie zu erklären. Wenn ihr Bugs gefunden habt, wäre es toll, wenn ihr mir Bescheid geben könntet. Außerdem würde ich mich über Anregungen zur Programmbibliothek freuen und ich hoffe auch, dass das Interesse an der neuen Lib genauso groß ist, wie das an der alten.

      Gruß
      ~blaze~
      hi

      habe gerade deine lib gefunden und möchte diese wohl gern in mein programm mit verwenden.
      nur leider steh ich im moment auf dem schlauch und weiß gar nicht wie ich z.b. jetzt einstellungen in eine ini speichern kann und wieder laden kann
      die einstellungen sind bei mir alle in textboxen geschrieben bzw in labels.
      wäre klasse wenn du mal ein beispiel programm erstellen würdest

      Gruß
      Hast du dir die Beispiele angesehen? Ansonsten wärs ganz einfach:

      VB.NET-Quellcode

      1. Public Sub SaveSettings()
      2. 'Speichern
      3. 'IniFile-Instanz erzeugen, damit die Einstellungen verwaltet werden koennen
      4. Dim file As New INILib.IniFile()
      5. 'Zielsektion [settings] anlegen
      6. Dim targetSection As New INILib.IniFileSection(file, "settings")
      7. 'something = TextBox1.Text als Unterelement der Zielsektion hinzufuegen
      8. targetSection.KeyValues.Add(New INILib.IniFileKeyValuePair(targetSection, "something", TextBox1.Text))
      9. 'Zielsektion der IniFile wirklich hinzufuegen
      10. file.Sections.Add(targetSection)
      11. file.Save("filename.ini")
      12. End Sub
      13. Public Sub LoadSettings()
      14. If IO.File.Exists("filename.ini") Then
      15. 'Laden
      16. 'IniFile-Instanz erzeugen, damit die Einstellungen verwaltet werden koennen
      17. Dim file As New INILib.IniFile()
      18. 'entweder entsprechende Ueberladung vom Konstruktor der INILib.IniFile verwenden oder Load zum Laden aufrufen
      19. file.LoadFile("filename.ini")
      20. 'ist die verlangte Section ueberhaupt in der Auflistung enthalten...
      21. If file.Sections.Contains("settings") Then
      22. 'Hier werden alle Werte aus der entsprechenden Sektion ausgelesen
      23. With file.Sections("settings")
      24. 'Ist in der Sektion der Schluessel "something" verfuegbar, wird der Text der TextBox gesetzt
      25. If .KeyValues.Contains("something") Then
      26. 'Text der Textbox auf den angegebenen Wert setzen
      27. TextBox1.Text = .KeyValues("something").Value
      28. Else
      29. 'ansonsten wird der Standardwert fuer die TextBox uebernommen
      30. TextBox1.Text = "default text"
      31. End If
      32. End With
      33. Else
      34. 'ansonsten werden die Standardwerte uebernommen
      35. TextBox1.Text = "default text"
      36. End If
      37. End If
      38. 'kleine Anmerkung am Schluss: In einigen Faellen ist es effizienter, ueber eine
      39. 'For-Next-Schleife alle Schluessel-Wert-Paare in einer Ini-Sektion durchzugehen und
      40. 'die Inhalte auszuwerten. Das ist allerdings fallabhaengig
      41. End Sub


      Du kannst die TextBox1.Text = "default text" Sachen auch des Öfteren weglassen. Die benötigst du nur, wenn in den TextBoxen nicht die Standardwerte drin stehen (also z.B. wenn du willkürlich Daten einträgst, die der User aber gar nicht sehen soll oder wenn der User bereits vorher Eingaben machen konnte)

      Gruß
      ~blaze~
      Habe ein Problem mit einer For Each-Schleife und der INIFile.Sections-Liste.

      VB.NET-Quellcode

      1. For Each Section In SoftwareList.Sections
      2. SoftwareListBox.Items.Add(SoftwareList.GetKey(Section, "name"))
      3. Next

      Allerdings bekomme ich den Fehler
      Der Wert vom Typ "INILib.IniFileSection" kann nicht in "String" konvertiert werden.


      Ich habe schon einiges ausprobiert bekomme den Fehler aber nicht selbst gelöst...
      Hi
      überleg noch mal, warum das nicht funktionieren kann. Schau dir dazu GetKey und die Fehlermeldung an.

      Das hier wäre die Lösung:

      VB.NET-Quellcode

      1. Dim inifile As New IniFile()
      2. For Each section As IniFileSection In inifile.Sections
      3. SoftwareListBox.Items.Add(section.GetKeyValuePair("name"))
      4. Next


      Gruß
      ~blaze~
      Logisch :pinch:

      EDIT: Ich versuche jetzt schon die ganze Zeit mit SetValue einen neuen Schlüssel hinzuzufügen. Allerdings passiert einfach nichts. Keine Fehlermeldung tauch auf, allerdings werden die entsprechenden Werte nicht geschrieben...

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

      Hallo,

      ich haben KEIN Problem und auch KEINE Frage...

      ich wollte demjenigen der dies gemacht hat lediglich nur sagen - GEILE SACHE! ;)
      Funktioniert sowohl mit .NET Framework 2, .NET Framework 3, .NET Framework 3.5 und sogar .NET Framework 4 und .NET Framework 4.5 :D

      Danke für dieses Tolle Werkzeug :) :thumbsup:
      Nothing to see :whistling:

      Frage zur Paramerisierung der IniLib

      Die von unserem Programm einzulesenden Ini-Dateien enthalten Key-Value-Paare, deren Wert = Null sein kann. Diese können von IniLib nicht eingelesen werde, da im Sourcecode "clsIniTextReader\ReadValue" die Protected Overridable ReadOnly Property "AllowEmptyValues", die auf False voreingestellt ist, dies verhindert. Welche Konsequenzen hätte denn die Einstellung dieser Eigenschaft auf True?

      Ansonsten muß ich sagen: Tolle Arbeit, Burschen und BurschInnen!
      @kaheiho:: Willkommen im Forum. :thumbup:
      Mach Dir eine kleine Testapplikation und teste es aus.
      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!
      Also vorgesehen ist, dass damit solche Zeilen zugelassen werden:
      Test =

      Ist das das, was du benötigst? Ansonsten wäre Value halt "Null", das geht nat. immer. Über die integrierte Serialisierung sollte es ebenfalls möglich sein, auch wenn Ini nicht unbedingt das richtige Format dafür ist.

      Danke übrigens, freut mich, dass es gefällt ;).

      Gruß
      ~blaze~
      Huch, habe gar nicht mitgekriegt, dass es hier eine gibt. Ich habe am Anfang eine gebraucht (vom Beep) und nachdem sie mit Sonderzeichen nicht umgehen konnte, habe ich mir selbst eine geschrieben (natürlich bestimmt nicht so umfangreich wie deine :) ).
      Danach habe ich mitgekriegt, dass es von Microsoft selbst eine gibt, was ist der Unterschied, weißt du das zufällig?