Ini-Dateien

    • VB.NET

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

      Ini-Dateien

      Hi
      Ich programmiere gerade eine Dll zum auslesen und schreiben von Ini-Dateien und brauche Tipps, was man alles einbauen kann ^^. Ich würde mich freuen, wenn ihr sie testen würdet und mir Verbesserungsvorschläge, Erweiterungsvorschläge und Fehler berichten würdet ;)
      Die Library dürft ihr natürlich auch in euren (kostenlosen!) Projekten benutzen (bitte einen namentlichen Verweis auf mich).

      Update: Die IniLib wurde komplett neu überarbeitet. Daher bitte Version 2.0 hier herunterladen. Der Sourcecode wurde nun doch bereit gestellt (Update vom 24.12.2011)

      Veraltete Downloadlinks
      IniLib.zip (Komprimierte Datengröße: 25,8 KB)
      INILib SourceCode.zip (Komprimierte Datengröße: 19,53 KB)


      Gruß
      ~blaze~

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

      Was ist das für eine DLL? Einsprungpunkt, ActiveX, .net?
      Und ins OffTopic passt das Thema besser. -> verschoben
      Schade das kein SourceCode dabei ist, sonst wärs SourceCodeAustausch gewesen.
      Gruß, Agent Smith 8-)

      activeFlags = (lazy OR weary)

      Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
      Öhm, das ist keine ActiveX-Dll sondern ein .Net Assembly :) Ansonsten schön Programmiert obwohl ich persönlich lieber XML statt Ini verwende aber jetzt keine Diskussion über die Vor- und Nachteile der beiden Formate vom Zaun brechen möchte.
      Ups ^^ Dritte Auswahlmöglichkeit übersehn *müde*

      Übrigens:
      Bei Functions.Converter gibt es ja eine ObjectToString-Methode. Die ist bissl schwer zu verstehen. Da nehm ich mir mal die raus:

      VB.NET-Quellcode

      1. Public Shared Function ObjectToString(Of T)(ByVal obj As T, ByVal IgnoreCase As Boolean, ByVal TypeHandlers() As TypeHandler, ByVal ParamArray Properties() As String) As String


      Bei TypeHandler wird der Delegat

      VB.NET-Quellcode

      1. Public Delegate Function ConvertionHandler(ByVal Type As Type, ByVal Value As Object)

      verwendet.

      Der Aufruf läuft so:

      VB.NET-Quellcode

      1. Dim myString As String = Functions.Converter.ObjectToString(Of Color)(Color.Blue, True, New Functions.TypeHandler(){New TypeHandler(GetType(Byte), AddressOf ColorToString)}, "R", "G", "B")
      2. Public Function ByteToString(ByVal tp As Type, value As Object) As String
      3. Return CType(value, Byte).ToString
      4. End Function


      "R", "G" und "B" sind die Properties, die gespeichert werden. Als Ausgabe sollte man beispielsweise für Blau 0; 0; 255 bekommen. Wichtig! Für Type bei TypeHandler unbedingt alle Typen übergeben, die gespeichert werden (oder Object)!

      Gruß
      ~blaze~

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

      Da es eine .NET DLL ist, brauchst du den Code nicht zu veröffentlichen, denn du hast ihn offen lesbar veröffentlicht ;)

      Ansonsten nehm ich auch eher XML anstatt INI, aber der Code (was ich so überflogen hab) sieht ganz ok aus.
      mh, ich bin gerade nicht in der Lage meins zu Posten aber ich habe nen Modul zum schreiben in Ini-Dateien und auslesen! wer interessiert ist kann mir ja ne nachricht schreiben, jetzt muss ich mal pennen/ausnüchtern ^^^^^^^^ gute nacht!
      So
      Source Code und Assemblies geuppt. Wenn die Archive defekt sind, versuchts mal mit 7zip.

      Der Source Code darf übrigens nicht in eure Projekte übernommen werden (will ich nicht). Ihr könnt ihn aber erweitern und euch dann als Hersteller hinzufügen.

      Gruß
      ~blaze~

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

      Hi
      Heute kommt mein erstes Tutorial zum Thema "Arbeiten mit der IniLib" passend zu einem neuen Update raus (wird auch

      verwendet!). Und zwar, wie man mit den präsentierten Klassen arbeitet. Dabei werde vorerst nur auf die IniFile, IniSection

      und IniKey eingehen. Zum Schluss kommt noch der für mich interessanteste Teil - ObjectToString und StringToObject.

      1. Die IniFile-Klasse

      Die normale Ini-Datei hat folgenden Aufbau:

      [Section];Comment
      Key = Value; Comment

      Das Trennzeichen für mehrere Werte und Kommentare kann in der Klasse IniFileConfiguration festgelegt werden.

      1.1 Instanzierung
      Die Klasse an sich ist eigentlich nur der Behälter für IniSections. Sie bietet 3 Konstruktoren:

      VB.NET-Quellcode

      1. Public Sub New()
      2. Public Sub New(FileName, [Encoding])
      3. Public Sub New(Stream, [Encoding], [Close])


      Und außerdem 4 statische Methoden, um eine Instanz zu erzeugen:

      VB.NET-Quellcode

      1. Public Shared Function FromContent(Content) As IniFile
      2. Public Shared Function FromXMLFile(Document As Xml.XmlDocument) As IniFile
      3. Public Shared Function FromBytes(Bytes()) As IniFile
      4. Public Shared Function FromBytes(Bytes(), Encoding) As IniFile



      Mit New() kann man eine leere Ini-Dateie erstellen.
      New(FileName, [Encoding]) lädt eine Datei mit dem angegebenen Encoding.
      New(Stream, [Encoding]) lädt einen Stream mit dem angegebenen Encoding.

      Der Encoding-Parameter ist bei den letzten beiden optional. Als Basiswert wird System.Text.Encoding.Default verwendet.

      FromContent lädt die Daten aus dem String.
      FromXMLFile konvertiert ein XML-Dokument in ein IniFile. Alle Werte, deren Level größer als 3 ist, werden dabei ignoriert.
      FromBytes lädt das Dokument aus einem Byte-Array. Hier lässt sich auch ein Encoding angeben.

      1.2 Hinzufügen, entfernen und bearbeiten von Ini-Sektionen
      1.2.1 Hinzufügen und entfernen

      Das Hinzufügen wird über AppendSection gelöst:

      VB.NET-Quellcode

      1. Public Sub AppendSection(IniSection)
      2. Public Sub AppendSections(IniSections())


      AppendSection benötigt die Sektion, die hinzugefügt werden soll und AppendSections ein Array aus den Sektionen.

      Außerdem kann man eine Section auch einfügen:
      Public Sub InsertSection(IniSection, Index)

      InsertSection benötigt als 1. Parameter die Sektion, die eingefügt werden soll und als 2. die neue Position dieser.

      Da die Möglichkeit, mehere Sektionen auf einmal einzufügen nicht unterstürzt wird, kann man das so lösen:

      VB.NET-Quellcode

      1. Dim isaSections() As IniSection ' Alle Sektionen
      2. Dim infIniFile As IniFile ' Datei
      3. Dim intIndex As Integer ' Index
      4. For i As Integer = isaSections.Length -1 To 0 Step -1
      5. infIniFile.Insert(isaSections(i), intIndex)
      6. Next


      Zum Löschen werden folgende Möglichkeiten angeboten:

      VB.NET-Quellcode

      1. Public Sub RemoveSection(IniSection)
      2. Public Sub RemoveSection(Index)


      Der Parameter für RemoveSection(IniSection) ist die Sektion, die Sie löschen möchten. Index ist die Position des Eintrags,

      der gelöscht werden soll.

      Clear löscht alle Einträge:
      Public Sub Clear()


      1.2.2 Bearbeiten
      Ini-Sektionen kann man nicht über die Liste "Sections" bearbeiten, da diese nicht von außen editierbar ist. Dafür werden

      folgende Funktionen zum herausfinden zur Verfügung gestellt:

      Public Function FindSection(SectionName, Key, [Value], [StartIndex]) As IniSection

      Sucht durchsucht in den Sektionen nach einer exakt übereinstimmenden Sektion. SectionName ist der Name der Sektion. Key ist

      ein Key, der enthalten sein soll. (logisch oder? ;)) Value ist der Wert, den der Key haben soll und ist optional. StartIndex

      ist der Index, von dem aus die Suche gestartet werden soll.

      VB.NET-Quellcode

      1. Public Function GetSection(SectionName, [StartIndex]) As IniSection
      2. Public Function GetSection(SectionName, IniKey, [StartIndex]) As IniSection
      3. Public Function GetSections(SectionName, [StartIndex], [Count]) As IniSection()
      4. Public Function GetSections(SectionName, IniName, [StartIndex], [Count]) As IniSection()


      GetSection liefert die erste Sektion, die den Kriterien entspricht. SectionName ist der Name der Sektion, die gesucht werden

      soll, StartIndex(Optional), der Punkt, an dem eingestiegen wird. Die 2. Option verfügt noch über die Möglichkeit, mit IniKey

      nach einem enthaltenen IniKey zu suchen. GetSections macht das Gleiche, nur dass es alle Werte, die den Kriterien entsprechen

      zurückliefert. Der optionale Parameter Count definiert die maximale Anzahl der zu suchenden Items und ist als Standard -1

      (alle gefundenen Werte).

      Für das Nächste Index wird die Methode GetNextIniKeyIndex verwendet:

      VB.NET-Quellcode

      1. Public Function GetNextIniKeyIndex(SectionName, IniName, [StartIndex]) As Integer


      Hier sind alle Parameter das Gleiche wie oben bei GetSections.

      1.3 Speichern und Laden
      Zum Speichern werden folgende Methoden angeboten:

      VB.NET-Quellcode

      1. Public Function Save(Path, [Encoding]) As FileInfo
      2. Public Sub Save(ref Stream, [Close], [Encoding])


      Save(Path, [Encoding]) erwartet für Path den Pfad für die Datei. Optional kann das Encoding angegeben werden. Nach dem

      speichern wir das Event SavedToFile ausgelöst.

      Save(ref Stream, [Close], [Encoding]) erwartet als Parameter den Stream (ref gibt an, dass eine Referenz auf den Stream

      gesetzt wird). Der Optionale Parameter Close gibt an, ob der Stream nach dem schreiben geschlossen werden soll. Encoding ist

      wieder das Encoding des Streams. Nach dem Speichern wird das Event SavedToStream ausgelöst.

      1.4 Konvertierungen und Operatoren
      Als Konvertierungen in Ini-Files wird nur System.String angeboten. Das entspricht dann der statischen Methode FromContent

      (Content).


      Die Operatoren + und & fügen zwei Ini-Files zusammen bzw. fügen eine Ini-Section an.

      2. IniSections

      (Dieser Teil ist nicht mehr so ausführlich, da das meiste selbsterklärend sein sollte und es so viel Schreibarbeit ist :D)

      Übrigens: Nach den ersten Versionen wurde das Hinzufügen von IniKeys durch SetKeyValue ersetzt, kommt aber im neusten Update

      unter dem Namen AddKey wieder!

      2.1 Instanzierung
      Zum instanzieren gibt es nur 2 Möglichkeiten:

      Für leere Ini-Sektionen sollte man das Parameterlose New() verwenden:

      VB.NET-Quellcode

      1. Public Sub New()


      Außerdem wird die Möglichkeit unterstützt, gleich einige Werte zu setzen:

      VB.NET-Quellcode

      1. Public Sub New(SectionName, [SectionComment])


      SectionName ist der Name der Sektion und SectionComment(optional) das Kommentar, das drangehängt wird.

      Außerdem werden gleichnamige Eigenschaften angeboten, die den gleichen Zweck haben.

      2.2 Analyse

      ZUr Analyse kann man die Liste Keys verwenden. Außerdem kann geprüft werden, ob ein Key mit dem angegebenen Namen enthalten

      ist und an welcher Position sich dieser befindet:

      VB.NET-Quellcode

      1. Public Function Contains(KeyName) As Boolean
      prüft, ob der Key existiert.

      VB.NET-Quellcode

      1. Public Function IndexOf(KeyName) As Integer
      gibt die Position zurück.

      2.3 Konvertierung und Operatoren
      Wie IniFile kann die Ini-Section ebenfalls in Strings konvertiert werden. Allerdings unterstützt sie noch keine Konvertierung

      AUS Strings.

      Es werden nur + und & als Operatoren angeboten. Dadurch kann man IniKeys in umgewandelter bzw. String Form hinzufügen.

      2.4 Hinzufügen und Setzen von Keys

      Zum Hinzufügen kann man entweder SetKeyValue InsertKey oder AddKey verwenden:

      VB.NET-Quellcode

      1. Public Sub InsertKey(Key,Index)
      2. Public Sub InsertKey(KeyName, Value, Index, [Comment])
      3. Public Sub AddKey(Key)
      4. Public Sub AddKey(KeyName, Value, [Comment])


      AddKey und InsertKey haben die gleichen Parameter bis auf Index bei Insertkey.
      KeyName gibt den Namen des Key an, Value den Wert und Comment das Kommentar.(wie immer ;)) Bei Insertkey ist Index die

      Position, an der das neue Item eingefügt werden soll.

      Außerdem gibt es noch SetKeyValue, was, wenn der angegebene Key existiert, dessen Wert auf NewValue und das Kommentar auf

      Comment gesetzt. Falls er nicht existiert, wird er mit den entsprechenden Werten erzeugt.

      2.5 Löschen

      Gelöscht wird so:
      Clear löscht alle Keys, RemoveKey löscht einen key und erwartet entweder den IniKey selbst, dessen Namen oder dessen Index

      als Parameter.

      2.6 Events
      Es gibt eine Reihe unterstützter Events:
      Auf ein Item bezogen:
      KeyAdded - Wird ausgelöst, wenn ein key hinzugefügt wird
      KeyValueChanged - Wird ausgelöst, wenn sich der Wert eines keys ändert
      KeyCommentChanged - Wird ausgelöst, wenn sich das Kommentar eines keys ändert
      KeyRemoved - Wird ausgelöst, wenn ein Key entfernt wird
      KeyCommentsChanged - Wird ausgelöst, wenn sich irgendein Kommentar ändert
      KeysCleared - Wird ausgelöst, wenn alle Keys auf einmal gelöscht werden
      KeyValuesChanged - Wird ausgelöst, wenn sich der Wert eines Keys ändert
      SectionNameChanged - Wird ausgelöst, wenn sich der Name der Section ändert
      SectionCommentChanged - Wird ausgelöst, wenn sich das Kommentar der Section ändert

      3. Ini keys
      3.1 Instanzierung
      Es gibt wieder eine Methode zum Instanzieren, die parameterlos ist und eine, die die Werte "Name des Keys","Wert" und

      "Kommentar" erwartet. Außerdem kann ein Key von einem String erstellt werden: IniKey.FromStringKey(Key).

      Achtung: Der Name des IniKeys kann nicht geändert werden, da das zu Problemen mit der Liste in der Section führen kann!

      3.2 Konvertierung
      IniKey unterstüzt wieder die Konvertierung eines Strings in den key, und die Konvertierung eines IniKeys in einen String.

      4. Konvertierung von String zu Object und Object zu String
      Jetzt sind wir bei dem Teil angekommen, der mir am meisten Spaß gemacht hat:
      4.1 StringToObject
      StringToObject dient dazu, Werte aus einem String in ein Object zurückzuladen. Es gibt "nur" zwei Überladungen:
      Public Shared Sub StringToObject(Value, obj, TypeHandlers(), Properties())

      und das Gleiche mit einem IgnoreCase

      IgnoreCase sorgt nur dafür, dass es nicht auf Groß-und Kleinschreibung achtet (false).

      Value ist der Wert, aus dem die Eigenschaften gelesen werden, obj ist die instanzierte(!) Klasse des Objekts, dessen

      Eigenschaften gesetzt werden sollen. Properties sind die Namen der zu speichernden Eigenschaften. TypeHandlers ist dazu da,

      um einen bestimmten Typen zu behandeln.

      Das läuft so:
      Man erstellt einen TypeHandler mit dem Typ und einem Delegaten, dem ConvertionHandler, der einen Typen behandelt. Dann

      erzeugt man eine Instanz der Klasse, die man erstellen möchte. Jetzt kann man die Methode aufrufen. Allerdings braucht man

      noch einen String, der ausgewertet werden soll. Dazu ein Beispiel mit der Klasse X.

      VB.NET-Quellcode

      1. Public Class X
      2. Private intY As Integer
      3. Public Property Y() As Integer
      4. Get
      5. Return intY
      6. End Get
      7. Set(ByVal value As Integer)
      8. intY = value
      9. End Set
      10. End Property
      11. End Class
      12. Public Class SaveX
      13. Public Function IntegerHandler(ByVal Type As Type, ByVal Value As Object) As Object
      14. 'Übergebenen Wert in Integer konvertieren
      15. Return CInt(Value)
      16. End Function
      17. Public Function GetObjectProperties() As X
      18. 'Neuen ConvertionHandler erstellen mit dem Ziel IntegerHandler
      19. Dim convertionHandler As New Functions.ConvertionHandler(AddressOf IntegerHandler)
      20. 'TypeHandler für den Typen Integer erstellen und convertionHandler zur Auswertung des Strings übergeben.
      21. Dim tpHandler As New Functions.TypeHandler(GetType(Integer), convertionHandler)
      22. 'Instanz von X erstellen
      23. Dim obj As New X
      24. 'Wert 12 der Eigenschaft Y vom Typ X zuweisen.
      25. Functions.Converter.StringToObject("12", obj, New Functions.TypeHandler() {tpHandler}, "Y")
      26. 'X zurückgeben
      27. Return obj
      28. End Function
      29. End Class


      Der String, der ausgewertet wurde ist hier "12".

      Tipp: Klassen wie Color, von denen viele Eigenschaften ReadOnly sind, kann man zwar nicht so behandeln wie sie sind, aber man

      kann eine eigene Klasse(bzw. Structure) erstellen, die die gleichen Eigenschaften enthält.(Also eine Klasse mit den

      Eigenschaften R, G, B, ... erstellen und diese dann instanziert übergeben. Mit Color.FromArgb lässt sich das dann

      konvertieren.) Es können aber nur Eigenschaften behandelt werden. Für Felder ist die Funktion nicht gemacht.

      Übrigens: Bei der Übergabe eines TypeHandlers, der Object behandelt, wird ermöglicht, dass man alle Typen damit behandelt,

      die nicht in den anderen TypeHandlern behandelt werden! Deshalb wird auch Type als Parameter bei dem ConvertionHandler

      übergeben!

      4.2 ObjectToString
      ObjectToString funktioniert eigentlich wie StringToObject, nur dass noch die Rückgabe eines Generischen Typen unterstützt

      wird oder gar keine TypeHandler benötigt werden. Aber das ist nicht so wichtig und auch nicht so schwierig...(eigentlich

      überflüssig :D )

      Man übergibt die Instanz einer Klasse, die entsprechenden TypeHandler und die zu speichernden Eigenschaften.

      Dazu wieder ein Beispiel:

      VB.NET-Quellcode

      1. Public Class X
      2. Private intY As Integer
      3. Public Property Y() As Integer
      4. Get
      5. Return intY
      6. End Get
      7. Set(ByVal value As Integer)
      8. intY = value
      9. End Set
      10. End Property
      11. End Class
      12. Public Class SaveX
      13. Public Function IntegerHandler(ByVal Type As Type, ByVal Value As Object) As Object
      14. Return Value.ToString
      15. End Function
      16. Public Function GetString() As String
      17. Dim TypeHandler As New Functions.TypeHandler(GetType(Integer), AddressOf IntegerHandler)
      18. Dim instance As New X
      19. instance.Y = 12345
      20. Return Functions.Converter.ObjectToString(instance, New Functions.TypeHandler() {TypeHandler}, "Y")
      21. End Function
      22. End Class


      Hier gelten auch dieselben Regeln wie oben.

      Gruß
      ~blaze~

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

      Ist ganz einfach:
      -runterladen
      -entpacken
      -In der IDE auf Mein Projekt->Verweise->Hinzufügen->Durchsuchen klicken und die Datei einbinden
      -Evtl den Namespace IniLib importieren

      Danach kann man den Inhalt einfach verwenden.

      Bitte sagt mir doch Bugs. Ich selbst komme nicht zum Testen und stoße nur beim drüberschauen auf Fehler.

      Gruß
      ~blaze~