Feedback

VB - Neu: Klasse für Verwendung von INI-Dateien

Veröffentlicht von am 2/10/2009
(4 Bewertungen)
Aufbauend auf: v1.0 http://dotnet-snippets.de/dns/klasse-fuer-verwendung-von-ini-dateien-SID938.aspx

' v1.1: BugFix - Fehler bei "DateiLöschen" behoben (Private/Public)
' v1.2: Konstuktor für Pfad hinzu gefügt
' v1.3: Exceptions bei Dateilese- und Schreibfehlern werden gefangen
' v1.0: Entnommen aus: http://dotnet-snippets.de/dns/klasse-fuer-verwendung-von-ini-dateien-SID938.aspx
' änderungen von www.RaphaelWolfer.de
' v1.1: BugFix - Fehler bei "DateiLöschen" behoben (Private/Public)
' v1.2: Konstuktor für Pfad hinzu gefügt
' v1.3: Exceptions bei Dateilese- und Schreibfehlern werden gefangen
Public Class INIDatei
    ' Öffentliche Klassenvariablen, Ändern des Pfades nach der Instanziierung möglich
    Public Pfad As String

    ' Konstruktor für setzen des Pfades
    ' Instanziieren mit z.B.: 
    '   Dim Inipfad As String = My.Application.Info.DirectoryPath & "\beispiel.ini"
    '   Dim ini As New INIDatei(Inipfad)
    Sub New(ByVal Pfad_der_ini As String)
        Pfad = Pfad_der_ini
    End Sub
    ' Instantiierung ohne Pfad wird nicht erlaubt
    'Sub New() 'kein Pfad notwendig...
    'End Sub

    ' 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



    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
        Try
            ' 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
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        ' 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)
        Try
            If Not (System.IO.File.Exists(Pfad)) Then
                MsgBox("Die Datei " & vbCrLf & Pfad & vbCrLf & "existiert nicht und wird neu angelegt")
            End If
            Dim Filetest As Short = FreeFile()
            FileOpen(Filetest, Pfad, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.LockReadWrite)
            FileClose(Filetest)


            '            MsgBox(System.IO.File.GetAccessControl(Pfad))

            'Dim fs As New System.IO.FileStream(Pfad, IO.FileMode.)
            'Dim fs As New System.IO.FileStream(Pfad, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
            ' 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
            'System.IO.FileSt()
            ' 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)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Sub SchlüsselLöschen(ByVal Sektion As String, ByVal Schlüssel As String)
        Try
            ' 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)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Sub SektionLöschen(ByVal Sektion As String)
        Try
            ' 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)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    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"
        Try


            ' 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)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Public 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
        Try
            ' 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)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Class

Abgelegt unter Inidatei, Ini, read, write, lesen, schreiben, inifile.

3 Kommentare zum Snippet

Raylow schrieb am 9/10/2009:
Echt ne feine Sache Deine Klasse :-)

Nur irgendwie steh ich auf'm Schlauch.. krieg nichts ausgelesen..

MsgBox(x.WertLesen("Test", "Key").ToString)



Inhalt in der INI sieht so aus:

[Test]
Key = ja



Die Messagebox is einfach leer oO
raphzahn schrieb am 12/2/2009:
na so was der code war weg...
hatte auf Anfrage eines Users noch ein Backup davon

Grüße, Raphael Wolfer
AK1987 schrieb am 11/30/2012:
bug

Public Class frm1

Dim INI As New INIDatei
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click


INI.Pfad = Application.StartupPath & "\Test.ini"
INI.WertSchreiben("Set1", "1", "11111111111111")
End Sub
End Class


hier der bug

wen ich das deaktiviere dan funktioniertrs

>>>>
Sub New(ByVal Pfad_der_ini As String)
Pfad = Pfad_der_ini
End Sub
<<<<
 

Logge dich ein, um hier zu kommentieren!