none
Get-/WritePrivateProfileString RRS feed

  • Frage

  • Hallo Experten,

    mit folgenden Code schreibe/lese ich Informationen in/aus eine Datei:

    Module Allgemein
        Private Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32
        Private Declare Ansi Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32
    
        Public Function INI_ReadValueFromFile(ByVal strSection As String, ByVal strKey As String, ByVal strDefault As String, ByVal strFile As String) As String
            Dim strTemp As String = Space(1024), lLength As Integer
            lLength = GetPrivateProfileString(strSection, strKey, strDefault, strTemp, strTemp.Length, strFile)
            Return (strTemp.Substring(0, lLength))
        End Function
        Public Function INI_WriteValueToFile(ByVal strSection As String, ByVal strKey As String, ByVal strValue As String, ByVal strFile As String) As Boolean
            Return (Not (WritePrivateProfileString(strSection, strKey, strValue, strFile) = 0))
        End Function
    End Module

    dabei wird folgende Datei(Auszug, das Original ist ewig lang) erstellt;

    [Definition Tags Tree]

    [BODY]

    BACKCOLOR=Black

    FORECOLOR=White

    [HTML]

    BACKCOLOR=Black

    FORECOLOR=White

    [HEAD]

    BACKCOLOR=Black

    FORECOLOR=White

    [TITLE]

    BACKCOLOR=#A5A5A5

    FORECOLOR=White

    ...

    Jetzt  meine Frage. Gibt es eine direkte Möglichkeit alle strKey ( das wären die [BODY];[HTML];[HEAD];etc) auszulesen? Mir ist klar, das ich die "Text"-Datei einfach einlesen könnte und nach den Klammern [...] suchen und selektieren könnte. Aber, vielleicht gibt es ja auch eine "richtige" Methode.

    Danke vorab ... mfg eem monarch




    Dienstag, 16. Dezember 2014 14:15

Antworten

  • Hi,

    ist die INI Datei historisch bedingt? Falls nicht, und falls Du dafür nicht alles mögliche umstellen musst, würde ich die ini wegschmeißen und mit XML arbeiten. Das geht doch erheblich einfacher mittels  Serialisierung/Deserialisierung.

    Ein Beispiel findest Du hier:

      http://www.aspnetzone.de/files/folders/stefanfalz/entry222489.aspx

    In deinem Fall würde man bspw. eine Klasse mit den Eigenschaften Key, BackColor und ForeColor erstellen und diese dann in einer List( Of <DeineKlasse> ) halten.

    Das lässt sich dann problemlos serialisieren und deserialisieren. D.h. Du musst keine Stringoperationen durchführen, nach Abschnittswerten suchen, Werte suchen, splitten, dem richtigen Schlüssel zuordnen, usw.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Monarch-Falter Mittwoch, 17. Dezember 2014 12:46
    Dienstag, 16. Dezember 2014 18:01
    Moderator

Alle Antworten

  • Hallo,
    das Einlesen unter .NET dürfte am schnellsten gehen:
    Dim sections = System.IO.File.ReadLines("PFAD").Where(Function(line) line.StartsWith("[") And line.EndsWith("]")).ToArray()
    Auch die von dir verwendeten WinAPI Methoden öffnen bei jedem Zugriff die Datei, bearbeiten sie und schließen sie wieder.
    Wenn es bei deiner Datei um Einstellungen geht, solltest du diese in der Einstellungsdatei n(Projekt > Eigenschaften > Einstellungen) anlegen. Eventuell lohnt es sich aber auch ein eigenes Klassenkonstrukt für das Lesen und Schreiben der Datei zu erstellen.

    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 16. Dezember 2014 14:30
    Moderator
  • Hi,

    ist die INI Datei historisch bedingt? Falls nicht, und falls Du dafür nicht alles mögliche umstellen musst, würde ich die ini wegschmeißen und mit XML arbeiten. Das geht doch erheblich einfacher mittels  Serialisierung/Deserialisierung.

    Ein Beispiel findest Du hier:

      http://www.aspnetzone.de/files/folders/stefanfalz/entry222489.aspx

    In deinem Fall würde man bspw. eine Klasse mit den Eigenschaften Key, BackColor und ForeColor erstellen und diese dann in einer List( Of <DeineKlasse> ) halten.

    Das lässt sich dann problemlos serialisieren und deserialisieren. D.h. Du musst keine Stringoperationen durchführen, nach Abschnittswerten suchen, Werte suchen, splitten, dem richtigen Schlüssel zuordnen, usw.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Monarch-Falter Mittwoch, 17. Dezember 2014 12:46
    Dienstag, 16. Dezember 2014 18:01
    Moderator
  • Hi Stefan,

    tolle Sache ... nehme ich! Falls ich dazu später noch Fragen habe? Neuen Thread aufmachen oder diesen hier weiter verwenden.

    Aber Danke für Lösung schon mal ... mfg eem Monarch

    Mittwoch, 17. Dezember 2014 10:17
  • Hi,

    ich würde einen neuen Thread aufmachen, da das dann mit der INI Datei nichts mehr zu tun hat.

    Freut mich, dass dir die Lösung mittels Serialisierung gefällt :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 17. Dezember 2014 12:36
    Moderator