Feedback

VB - Klasse für Verwendung von INI-Dateien

Veröffentlicht von am 30.08.2008
(3 Bewertungen)
Die nachfolgende Klasse deckt alle Erfordernisse ab, die im Zusammenhang mit INI-Dateien entstehen. Sie unterstützt folgende

Eigenschaften:

Pfad: Angeben des Pfades zur betreffenden Datei in einer oder Lesen desselben aus einer String-Variable.

Methoden:

- WertLesen: Liest einen Wert aus. Als Argumente müssen die Sektion und der Schlüssel, dessen Wert gelesen werden soll, angegeben werden.

- WertSchreiben: Schreibt einen Wert in die INI. Erforderliche Argumente: Sektion, Schlüssel und der Wert selbst (dieser kann z.B. der Text-Eigenschaft eines Steuerelementes entnommen werden).

- SchlüsselLöschen: Löscht innerhalb einer als Argument anzugebenen Sektion einen definierten Schlüssel nebst seines Wertes.

- SektionLöschen: Löscht eine komplette Sektion, die als Argument erwartet wird.

- BackupAnlegen: Erstellt ein Backup der Datei; der Zielpfad ist als Argument anzugeben. Dabei wird ein kompletter Pfad, inklusive Dateiname(!) erwartet und nicht nur der Zielordner. Beispiel für den Zielpfad: "D:\Test\MeinProgrammEinstellungen_Backup.ini"

- DateiLöschen: Löscht die INI, die in der Eigenschaft Pfad spezifiziert ist.

Die Rückgabe ausgelesener Werte erfolgt immer als String-Variable.

Ich weiß, Deutsch für Variablen u.ä. ist eigentlich verpönt - aber hilfreich für den, der in der Schule kein Englisch lernen konnte (wie ich) und für den deshalb das Deutsche einfacher ist. Also bitte über diesen Umstand nicht meckern ;-)

Der Code verwendet Snippets, die teilweise in anderen Listings hier schon verwendet werden (quasi eine Zusammenstellung mehrerer Snippetss in einer Klasse, ergänzt um Zusatzfunktionen).
Option Explicit On

Public Class INIDatei
    ' DLL-Funktionen zum LESEN der INI deklarieren
    Private Declare Ansi Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
        ByVal lpApplicationName As String, ByVal lpSchlüsselName As String, ByVal lpDefault As String, _
        ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer

    'DLL-Funktion zum SCHREIBEN in die INI deklarieren
    Private Declare Ansi Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
        ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, _
        ByVal lpFileName As String) As Integer

    'DLL-Funktion zum Löschen einer ganzen Sektion deklarieren
    Private Declare Ansi Function DeletePrivateProfileSection Lib "kernel32" Alias "WritePrivateProfileStringA" ( _
        ByVal Section As String, ByVal NoKey As Integer, ByVal NoSetting As Integer, _
        ByVal FileName As String) As Integer

    ' Öffentliche Klassenvariablen
    Public Pfad As String

    Public Function WertLesen(ByVal Sektion As String, ByVal Schlüssel As String, Optional ByVal Standardwert As String = "", Optional ByVal BufferSize As Integer = 1024) As String
        ' Testen, ob ein Pfad zur INI vorhanden ist
        If Pfad = "" Then
            MsgBox("Es ist kein Pfad zur INI angegeben. Deshalb ist das Auslesen des Wertes nicht möglich." _
                & vbCrLf & vbCrLf & "Angeforderte Sektion: " & Sektion & vbCrLf & "Angeforderter Schlüssel: " _
                & Schlüssel, MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            WertLesen = "Lesefehler"
            Exit Function
        End If

        ' Testen, ob die Datei existiert
        If IO.File.Exists(Pfad) = False Then
            MsgBox("Die angegebene INI-Datei exstiert auf diesem Rechner nicht. Deshalb ist das " _
                & "Auslesen des Wertes nicht möglich." & vbCrLf & vbCrLf & "INI-Datei: " & Pfad _
                & vbCrLf & "Angeforderte Sektion: " & Sektion & vbCrLf & "Angeforderter Schlüssel: " _
                & Schlüssel, MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            WertLesen = "Lesefehler"
            Exit Function
        End If

        ' Auslesen des Wertes
        Dim sTemp As String = Space(BufferSize)
        Dim Length As Integer = GetPrivateProfileString(Sektion, Schlüssel, Standardwert, sTemp, BufferSize, Pfad)
        Return Left(sTemp, Length)
    End Function

    Public Sub WertSchreiben(ByVal Sektion As String, ByVal Schlüssel As String, ByVal Wert As String)
        ' Testen, ob ein Pfad zur INI vorhanden ist
        If Pfad = "" Then
            MsgBox("Es ist kein Pfad zur INI angegeben. Deshalb ist das Schreiben des Wertes nicht möglich." _
                & vbCrLf & vbCrLf & "Angeforderte Sektion: " & Sektion & vbCrLf & "Zu schreibender Schlüssel: " _
                & Schlüssel, MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            Exit Sub
        End If

        ' Testen, ob der Order, in dem die INI liegen soll, existiert
        Dim Ordner As String
        Ordner = IO.Path.GetDirectoryName(Pfad)
        If IO.Directory.Exists(Ordner) = False Then
            MsgBox("Die angegebene Ordner für die INI-Datei exstiert auf diesem Rechner nicht. Deshalb ist das " _
                & "Schreiben des Wertes nicht möglich." & vbCrLf & vbCrLf & "Fehlender Ordner: " & Ordner _
                & vbCrLf & "Angeforderte Sektion: " & Sektion & vbCrLf & "Zu schreibender Schlüssel: " _
                & Schlüssel, MsgBoxStyle.Exclamation, "Pfad zur INI-Datei existiet nicht")
            Exit Sub
        End If

        ' Schreiben in die INI durchführen
        WritePrivateProfileString(Sektion, Schlüssel, Wert, Pfad)
    End Sub

    Public Sub SchlüsselLöschen(ByVal Sektion As String, ByVal Schlüssel As String)
        ' Testen, ob ein Pfad zur INI vorhanden ist
        If Pfad = "" Then
            MsgBox("Es ist kein Pfad zur INI angegeben. Deshalb ist das Löschen des Schlüssels nicht möglich." _
                & vbCrLf & vbCrLf & "Angeforderte Sektion: " & Sektion & vbCrLf & "Zu löschender Schlüssel: " _
                & Schlüssel, MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            Exit Sub
        End If

        ' Testen, ob die der Order, in dem die INI liegen soll, existiert
        Dim Ordner As String
        Ordner = IO.Path.GetDirectoryName(Pfad)
        If IO.Directory.Exists(Ordner) = False Then
            MsgBox("Die angegebene Ordner für die INI-Datei exstiert auf diesem Rechner nicht. Deshalb ist das " _
                & "Löschen des Wertes nicht möglich." & vbCrLf & vbCrLf & "Fehlender Ordner: " & Ordner _
                & vbCrLf & "Angeforderte Sektion: " & Sektion & vbCrLf & "Zu löschender Schlüssel: " _
                & Schlüssel, MsgBoxStyle.Exclamation, "Pfad zur INI-Datei existiert nicht")
            Exit Sub
        End If

        ' Löschen des Schlüssels durch eine Schreiboperation durchführen
        WritePrivateProfileString(Sektion, Schlüssel, Nothing, Pfad)
    End Sub

    Public Sub SektionLöschen(ByVal Sektion As String)
        ' Testen, ob ein Pfad zur INI vorhanden ist
        If Pfad = "" Then
            MsgBox("Es ist kein Pfad zur INI angegeben. Deshalb ist das Löschen der Sektion nicht möglich." _
                & vbCrLf & vbCrLf & "Angeforderte Sektion: " & Sektion, MsgBoxStyle.Exclamation, _
                "Pfad zur INI-Datei fehlt")
            Exit Sub
        End If

        ' Testen, ob die Datei existiert
        If IO.File.Exists(Pfad) = False Then
            MsgBox("Die angegebene INI-Datei exstiert auf diesem Rechner nicht. Deshalb ist das " _
                & "Löschen der Sektion nicht möglich." & vbCrLf & vbCrLf & "INI-Datei: " & Pfad _
                & vbCrLf & "Angeforderte Sektion: ", MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            Exit Sub
        End If

        'Löschen der Sektion durchführen
        DeletePrivateProfileSection(Sektion, 0, 0, Pfad)
    End Sub

    Public Sub BackupAnlegen(ByVal Zielpfad As String, Optional ByVal FehlermeldungAnzeigen As Boolean = False)
        'Als Zielpfad muss ein DATEIpfad angegeben werden, nicht nur der Ordner
        ' (also z.B. "D:\Test\MeinProgrammEinstellungen_Backup.ini"

        ' Testen, ob ein Pfad zur INI (der Quelldatei) vorhanden ist
        If Pfad = "" Then
            If FehlermeldungAnzeigen = True Then
                MsgBox("Es ist kein Pfad zur INI, von der ein Backup angelegt werden soll, angegeben." _
                    & "Das Backup konnte NICHT angelegt werden.", MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            End If
            Exit Sub
        End If

        ' Testen, ob der Ordner des Zielpfades existiert
        Dim Ordner As String
        Ordner = IO.Path.GetDirectoryName(Pfad)
        If IO.Directory.Exists(Ordner) = False Then
            If FehlermeldungAnzeigen = True Then
                MsgBox(Zielpfad & vbCrLf & vbCrLf & "Dieser Ordner existiert nicht." _
                   & vbCrLf & vbCrLf & "Das Backup konnte NICHT angelegt werden.", MsgBoxStyle.Exclamation, _
                   "Zielordner existiert nicht")
            End If
            Exit Sub
        End If
        ' Kopie der INI erstellen
        IO.File.Copy(Pfad, Zielpfad)
    End Sub

    Private Sub DateiLöschen(Optional ByVal FehlermeldungAnzeigen As Boolean = False)
        ' Testen, ob ein Pfad zur INI (der Quelldatei) vorhanden ist
        If Pfad = "" Then
            If FehlermeldungAnzeigen = True Then
                MsgBox("Es ist kein Pfad zur INI, die gelöscht werden soll, angegeben." _
                    & "Das Löschen konnte NICHT durchgeführt werden.", MsgBoxStyle.Exclamation, "Pfad zur INI-Datei fehlt")
            End If
            Exit Sub
        End If

        ' Testen, ob die Datei existiert
        If IO.File.Exists(Pfad) = False Then
            If FehlermeldungAnzeigen = True Then
                MsgBox(Pfad & vbCrLf & vbCrLf & "Diese Datei existiert bereits nicht mehr. " _
                    & "Das Löschen hat sich damit erübrigt.", MsgBoxStyle.Exclamation, _
                   "Datei existiert nicht mehr")
            End If
            Exit Sub
        End If

        ' Löschen durchführen
        IO.File.Delete(Pfad)
 End Sub

End Class

7 Kommentare zum Snippet

Volker Steitz schrieb am 08.09.2008:
Sehr praktisch
raphzahn schrieb am 05.02.2009:
Löschen von Ini-dateien mit der Option "DateiLöschen" funktioniert so nicht. => Privat muss in Public geändert werden!

Sonst sehr nützliche Klasse
Grüße, Raphael Wolfer
raphzahn schrieb am 10.02.2009:
Eine neue Version der Ini-Klasse findet ihr unter: http://dotnet-snippets.de/dns/neu-klasse-fuer-verwendung-von-ini-dateien-SID1076.aspx
Grüße Raphael
muessigb schrieb am 13.04.2014:
Ich hab ne neue Version erstellt, die noch viel Professioneller ist:
http://pastebin.com/X87L0ShL
Koopakiller schrieb am 14.04.2014:
Ich habe ja weder was dagegen die WinAPI zu benutzen oder das der Autor alles mit deutschen Namen benannt hat - hier stört mich etwas ganz anderes.
Man muss eine Instanz der Klasse anlegen - ok. Trotzdem werden die WinAPI Funktionen benutzt, die nach wie vor für jeden Aufruf einen neuen Stream erstellen müssen um die Daten zu lesen bzw. zu schreiben.

Wenn jemand wirklich etwas professionelles machen will, dann sollte er sich meiner Meinung nach an der XDocument-Klasse orientieren. Eine Funktion zum laden der Datei, eine zum Speichern und die Klasseninstanz enthält eine Liste mit den verschiedenen Werten.

Wie lange die WinAPI Aufrufe überhaupt noch funktionierne ist eine Frage für sich. Ich zitiere mal die MSDN:
This function is provided only for compatibility with 16-bit versions of Windows. Applications should store initialization information in the registry.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms725501.aspx
ToniSedlbauer schrieb am 06.11.2018:
Hallo zusammen,

ich versuche mich gerade mit Visual Studio 2017. Habe diesen Code hier gefunden, mir stellt such die Frage wie der Aufruf ist um eine Sektion auszulesen, und wo der Pfad zur INI eingetragen wird.

Danke schon mal
Koopakiller schrieb am 07.11.2018:
@ToniSedlbauer
Den Pfad zur INI-Datei kannst du in dem Feld Pfad in der Klasseninstanz festlegen.

Eine komplette Section kannst du soweit ich das hier sehe nicht auslesen. Immer nur einzelne Werte.
 

Logge dich ein, um hier zu kommentieren!