INI Funktion löst Fehler aus, wenn Eintrag nicht vorhanden

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    INI Funktion löst Fehler aus, wenn Eintrag nicht vorhanden

    Hallo, ich benutze folgende Funktion, hier aus dem Forum:

    VB.NET-Quellcode

    1. 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
    2. 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
    3. Public Function INI_ReadValueFromFile(ByVal strSection As String, ByVal strKey As String, ByVal strDefault As String, ByVal strFile As String) As String
    4. Dim strTemp As String = Space(1024), lLength As Integer
    5. lLength = GetPrivateProfileString(strSection, strKey, strDefault, strTemp, strTemp.Length, strFile)
    6. Return (strTemp.Substring(0, lLength))
    7. End Function
    8. Public Function INI_WriteValueToFile(ByVal strSection As String, ByVal strKey As String, ByVal strValue As String, ByVal strFile As String) As Boolean
    9. Return (Not (WritePrivateProfileString(strSection, strKey, strValue, strFile) = 0))
    10. End Function


    Leider kommt es zu Fehlermeldungen, wenn der gewünschte Eintrag beim Auslesen nicht vorhanden ist. Da ich diese Funktion nicht geschrieben habe und es mir schwer fällt sie mit meinem Wissen nachvollziehen zu können, wollte ich fragen wie ich eine Art Sicherheitsabfrage einbauen kann, dass falls der Eintrag nicht vorhanden ist, einfach es überspringt oder den Fehler in einer Textbox ausgibt oder Ähnliches.
    Nehm mal mein INI-System, ist ein Modul.!

    VB.NET-Quellcode

    1. Option Strict On
    2. Module Ini_System
    3. 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
    4. 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
    5. Declare Ansi Function GetPrivateProfileSection Lib "kernel32.dll" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32
    6. Public Function INI_ReadValueFromFile(ByVal strSection As String, ByVal strKey As String, ByVal strDefault As String, ByVal strFile As String) As String
    7. Dim strTemp As String = Space(1024), lLength As Integer
    8. lLength = GetPrivateProfileString(strSection, strKey, strDefault, strTemp, strTemp.Length, strFile)
    9. Return (strTemp.Substring(0, lLength))
    10. End Function
    11. Public Function INI_WriteValueToFile(ByVal strSection As String, ByVal strKey As String, ByVal strValue As String, ByVal strFile As String) As Boolean
    12. Return (Not (WritePrivateProfileString(strSection, strKey, strValue, strFile) = 0))
    13. End Function
    14. End Module
    Hey, danke für die schnelle Antwort. Magst du mir noch kurz erklären was daran der Unterschied ist? Vom Code ansich könnte es ja immer noch Probleme geben, wenn der Eintrag den ich auslesen will, fehlt.

    Zum Beispiel:

    [test]
    Name=Peter

    Und ich lese nun INI_ReadValueFromFile("test", "Nachname", "", ".\test.ini") aus, dann bekomme ich ein Fehler, da der Eintrag "Nachname" nicht vorhanden ist.
    Wie wird mein Problem durch ein Modul gelöst? Entschuldige, wenn das eine dumme Frage sein sollte.
    Also so sieht es aus wenn ich etwas auslesen möchte.


    VB.NET-Quellcode

    1. Dim strName as String
    2. strName = INI_ReadValueFromFile("SEKTIONSNAME","KEY", "nicht gefunden",Application.startuppath & "/config.ini")


    Dann wird in strName aus der Datei config.ini, welche im Ordner sein sollte, wo das Programm ist, der Wert aus Key aus der Sektion SEKTIONSNAME ausgelesen, insofern alles korrekt eingetragen ist.


    EDIT: In wie fern bekommst du eigentlich einen Fehler, eine exception oder wie sieht das Ganze aus?
    Ja ein Exception. Also so eine typische Fehlermeldung mit haufenweise Text (Ja das klingt wahrlich sehr präzise ich weiß :( ).
    Wobei ich das gerade in einem neuen Testprojekt ausprobiert habe und dort bekomme ich keine Fehlermeldung. Sprich wenn der Eintrag fehlt passiert einfach gar nichts (so wie es eigentlich auch gehört).
    Vielleicht habe ich einfach im Code irgendetwas anderes verwurstelt, werde ich mir noch einmal anschauen.

    Andere Frage:

    Wie kann ich explizit auslesen, ob Zeile X vorhanden ist? Also in deinem Falle die Zeile "KEY=nicht gefunden", gibt es da eine Möglichkeit das in die bereits existierende Funktion einzubauen, oder müsste ich dafür eine extra Funktion schreiben, welche mir alle Zeilen ausliest und in einen Array schmeißt und so weiter?

    Wäre ja schön, wenn man in der Funktion selbst eine "If-Then-Else" Abfrage einbauen könnte, die dann eben entweder den Wert in der INI ausgibt, oder falls der Eintrag nicht vorhanden ist, sowas ausgibt wie "Nicht vorhanden!" ?

    (Da der Eintrag in der INI nicht bestimmt ist, kann ich leider nicht in Code schreiben: If INI_ReadV.... = "Klaus" then..)
    Ich hoffe ich habe mich verständlich ausgedrückt^^
    Du kannst ja bei der INI-Abfrage angeben, qas für ein String / Wert kommen soll, wenn der Eintrag nicht da ist.
    Wenn dies nicht genug ist, musst Du halt 2 Abfragen machen mit 2 verschiedenen Nicht-Da-Antworten, und wenn beides mal diese kommen, ist die entsprechende Zeile definitiv nicht da.
    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!