Adres bazy danych, ustawienia przechowywane w pliku txt,cfg,ini

Ostatnio dostałem maila w którym jeden z internautów pyta się o metodę która pozwoli mu na przechowywanie adresu bazy danych w pliku *.txt tego typu rozwiązanie jest powszechnie stosowane a pliki tego typu mają zazwyczaj rozszerzenie *.ini. Przygotowałem dla was tego typu rozwiązanie.

Witam
Nie będę tu wychwalać bloga, bo i nie o to mi chodzi (blog super znalazłem w nim wiele podpowiedzi 🙂 )
Jednak mam pytanie.
Od dłuższego czasu borykam się z problemem przeniesienia pliku bazy danych login.sdf poza obszar uruchamiania programu (czyli ścieżkę określoną w properties/setting: Data Source=|DataDirectory|\Login.sdf)
Można to oczywiście zmienić ręcznie i wpisać tu zamiast |DataDirectory| np: d:\ przenosząc jednocześnie plik na dysk d:\.
Problem polega na tym że chciałbym aby lokalizacja pliku była elastyczna, czyli aby wartość |DataDirectory| mogła być odczytana np. z pliku serwer.txt zawierającym pełną ścieżkę do położenia pliku Login.sdf.
Czy jest jakiś prosty sposób aby tego dokonać 🙂 (sam się już nieraz stukałem w głowę że rzeczy nad którymi siedziałem godzinami można było rozwiązać w 3 minuty).
Niestety poziom mojej wiedzy w zakresie VB nie jest jakiś super (jakoś sobie radzę, czytam, wertuję strony WWW) ale cóż powoli się poddałem w tej kwestji.
Jeśli to możliwe proszę o pomoc..
 Trzymanie wszelkiego rodzaju ustawień w plikach edytowalnych takich jak txt, cfg lub ini jest powszechne i bardzo wygodne. Utworzenie pliku który będzie łatwo edytowalny w strukturze programu jest zazwyczaj niemożliwe. Takie rozwiązanie daje administratorowi możliwość edytowania istotnych informacji a programowi przechowywanie i przywracanie danych. Najpierw nasz program sprawdzi czy plik konfiguracyjny istnieje. Zrobimy to przy pomocy kodu:
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If System.IO.File.Exists(My.Application.Info.DirectoryPath + "\ustawienia.cfg") Then

        Else
            System.IO.File.Create(My.Application.Info.DirectoryPath + "\ustawienia.cfg").Dispose()
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Process.Start(My.Application.Info.DirectoryPath)
    End Sub
End Class
 Efekt :
plikkonfiguracjiwtxt
 Jeśli plik nie istniał, znaczy że nie przechowywał żadnych opcji, należy więc uzupełnić te opcje przy tworzeniu pliku. Dodam kilka zmiennych których opcje ustawimy. Ja wprowadziłem takie oto zmienne:
Imports System.Data.OleDb

Public Class Form1
    Dim kolorTla As Color
    Dim zmiennaTrueFalse As Boolean
    Dim zmiennaDouble As Double
    Dim adresBazyDanych As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If System.IO.File.Exists(My.Application.Info.DirectoryPath + "\ustawienia.cfg") Then

        Else
            System.IO.File.Create(My.Application.Info.DirectoryPath + "\ustawienia.cfg").Dispose()
            Dim objWriter As New System.IO.StreamWriter(My.Application.Info.DirectoryPath + "\ustawienia.cfg", True)
            objWriter.WriteLine("150,150,150")
            objWriter.WriteLine(False)
            objWriter.WriteLine(1.54)
            objWriter.WriteLine("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;")
            objWriter.Close()
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Process.Start(My.Application.Info.DirectoryPath)
    End Sub
End Class
Należy teraz usunąć nasz plik „\ustawienia.cfg” z folderu Debuger, ponieważ nie zostanie on utworzony gdyż już istnieje. Po jego usunięciu i uruchomieniu programu otrzymamy efekt:
 plikkonfiguracjiwtxt2Są to ustawienia domyślne jakie narzucimy z góry przy pierwszym uruchomieniu programu. Bierzemy pod uwagę w tym wypadku dwie opcje:
1. Plik nie istnieje. (Trzeba go utworzyć)
2. Plik istnieje, lecz jest uszkodzony. (Trzeba usunąć uszkodzony plik i utworzyć nowy)
Imports System.Data.OleDb

Public Class Form1
    Dim kolorTla As Color
    Dim zmiennaTrueFalse As Boolean
    Dim zmiennaDouble As Double
    Dim adresBazyDanych As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If System.IO.File.Exists(My.Application.Info.DirectoryPath + "\ustawienia.cfg") Then
            Dim FileNum As Integer = FreeFile()
            FileOpen(FileNum, My.Application.Info.DirectoryPath + "\ustawienia.cfg", OpenMode.Input)
            Try
                While Not EOF(FileNum)

                    Dim kolor As String() = LineInput(FileNum).Split(",")
                    Dim r As Byte = Convert.ToByte(kolor(0))
                    Dim g As Byte = Convert.ToByte(kolor(1))
                    Dim b As Byte = Convert.ToByte(kolor(2))
                    kolorTla = Color.FromArgb(r, g, b)
                    zmiennaTrueFalse = LineInput(FileNum)
                    zmiennaDouble = LineInput(FileNum)
                    adresBazyDanych = LineInput(FileNum)

                End While
                FileClose(FileNum)
            Catch ex As Exception
                MsgBox(ex.toString)
            End Try
        Else
            UstawieniaFabryczne()
        End If
        Me.BackColor = kolorTla
        Label1.Text = zmiennaTrueFalse.ToString
        Label2.Text = zmiennaDouble.ToString
        Label3.Text = adresBazyDanych
    End Sub

    Private Sub UstawieniaFabryczne()
        Dim path As String = My.Application.Info.DirectoryPath + "\ustawienia.cfg"
        If System.IO.File.Exists(path) Then
            ''Plik istnieje lecz jest uszkodzony
            System.IO.File.Delete(path)
            System.IO.File.Create(My.Application.Info.DirectoryPath + "\ustawienia.cfg").Dispose()
            Dim objWriter As New System.IO.StreamWriter(My.Application.Info.DirectoryPath + "\ustawienia.cfg", True)
            objWriter.WriteLine("150,150,150")
            objWriter.WriteLine(False)
            objWriter.WriteLine(1.54)
            objWriter.WriteLine("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;")
            objWriter.Close()
        Else
            ''Plik nie istnieje
            System.IO.File.Create(My.Application.Info.DirectoryPath + "\ustawienia.cfg").Dispose()
            Dim objWriter As New System.IO.StreamWriter(My.Application.Info.DirectoryPath + "\ustawienia.cfg", True)
            objWriter.WriteLine("150,150,150")
            objWriter.WriteLine(False)
            objWriter.WriteLine(1.54)
            objWriter.WriteLine("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;")
            objWriter.Close()
        End If

        kolorTla = Color.FromArgb(150, 150, 150)
        zmiennaTrueFalse = False
        zmiennaDouble = 1.54
        adresBazyDanych = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;"

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Process.Start(My.Application.Info.DirectoryPath)
    End Sub
End Class
 Efekt jest widoczny na obrazku:
plikkonfiguracjiwtxt3Drugi warunek mamy spełniony, plik nie istnieje więc ustawienia fabryczne są zapisywane. Co jeśli plik uszkodzimy? Wpisanie dodatkowych linii do naszego pliku cfg  lub je usunięcie będzie wyświetlało komunikat:
plikkonfiguracjiwtxt4
 Komunikat otrzymujemy dzięki wykorzystaniu pętli „Try…Catch ex As Exception…End Try” w momencie natrafienia na błąd w pętli zostanie wyświetlony komunikat o błędzie odbywa się to za pośrednictwem kodu: MsgBox(ex.ToString) gdzie ex przechowuje informacje o błędzie. Należy po prosu w momencie natrafienia na błąd wprowadzić ustawienia fabryczne:
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If System.IO.File.Exists(My.Application.Info.DirectoryPath + "\ustawienia.cfg") Then
            Dim FileNum As Integer = FreeFile()
            FileOpen(FileNum, My.Application.Info.DirectoryPath + "\ustawienia.cfg", OpenMode.Input)
            Try
                While Not EOF(FileNum)

                    Dim kolor As String() = LineInput(FileNum).Split(",")
                    Dim r As Byte = Convert.ToByte(kolor(0))
                    Dim g As Byte = Convert.ToByte(kolor(1))
                    Dim b As Byte = Convert.ToByte(kolor(2))
                    kolorTla = Color.FromArgb(r, g, b)
                    zmiennaTrueFalse = LineInput(FileNum)
                    zmiennaDouble = LineInput(FileNum)
                    adresBazyDanych = LineInput(FileNum)

                End While
                FileClose(FileNum)
            Catch ex As Exception
                FileClose(FileNum)
                MsgBox("Twój plik konfiguracyjny uległ awarii, zostaną przywrócone ustawienia domyślne!")
                UstawieniaFabryczne()
            End Try
        Else
            UstawieniaFabryczne()
        End If
        Me.BackColor = kolorTla
        Label1.Text = zmiennaTrueFalse.ToString
        Label2.Text = zmiennaDouble.ToString
        Label3.Text = adresBazyDanych
    End Sub

Nasze zmienne będziemy zapisywać przy zamykaniu formy. Tutaj mamy trzy możliwości

1. Usuwamy plik i tworzymy nowy. (przykład w UstawieniachFabrycznych).

2. Czytamy linie pliku i nadpisujemy każdą po kolei.

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        Dim path As String = My.Application.Info.DirectoryPath + "\ustawienia.cfg"
        Dim lines() As String = System.IO.File.ReadAllLines(path)
        Dim g As Byte = kolorTla.G
        Dim b As Byte = kolorTla.B
        Dim r As Byte = kolorTla.R
        lines(0) = r.ToString + "," + g.ToString + "," + b.ToString
        lines(1) = zmiennaTrueFalse.ToString
        lines(2) = zmiennaDouble.ToString
        lines(3) = adresBazyDanych.ToString
        System.IO.File.WriteAllLines(path, lines)
    End Sub

3. Otwieramy plik, czyścimy wszystkie linie i zapisujemy nowe.

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        Dim path As String = My.Application.Info.DirectoryPath + "\ustawienia.cfg"
        System.IO.File.WriteAllText(path, "")
        Dim objWriter As New System.IO.StreamWriter(path, True)
        Dim g As Byte = kolorTla.G
        Dim b As Byte = kolorTla.B
        Dim r As Byte = kolorTla.R
        objWriter.WriteLine(r.ToString + "," + g.ToString + "," + b.ToString)
        objWriter.WriteLine(zmiennaTrueFalse.ToString)
        objWriter.WriteLine(zmiennaDouble.ToString)
        objWriter.WriteLine(adresBazyDanych.ToString)
        objWriter.Close()
    End Sub

Czy obie opcje działają, sprawdźcie sami. U mnie wszystko działało poprawnie. Dodałem kilka modyfikacji, połączenie z bazą danych itp:

plikkonfiguracjiwtxt5

Pełen kod dostępny tutaj:  plikkonfiguracyjny_visualmonsters-cba-pl

Imports System.Data.OleDb

Public Class Form1
    Dim kolorTla As Color
    Dim zmiennaTrueFalse As Boolean
    Dim zmiennaDouble As Double
    Dim adresBazyDanych As String

    Public connection As New OleDbConnection()
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If System.IO.File.Exists(My.Application.Info.DirectoryPath + "\ustawienia.cfg") Then
            Dim FileNum As Integer = FreeFile()
            FileOpen(FileNum, My.Application.Info.DirectoryPath + "\ustawienia.cfg", OpenMode.Input)
            Try
                While Not EOF(FileNum)

                    Dim kolor As String() = LineInput(FileNum).Split(",")
                    Dim r As Byte = Convert.ToByte(kolor(0))
                    Dim g As Byte = Convert.ToByte(kolor(1))
                    Dim b As Byte = Convert.ToByte(kolor(2))
                    kolorTla = Color.FromArgb(r, g, b)
                    zmiennaTrueFalse = LineInput(FileNum)
                    zmiennaDouble = LineInput(FileNum)
                    adresBazyDanych = LineInput(FileNum)

                End While
                FileClose(FileNum)
            Catch ex As Exception
                FileClose(FileNum)
                MsgBox("Twój plik konfiguracyjny uległ awarii, zostaną przywrócone ustawienia domyślne!")
                UstawieniaFabryczne()
            End Try
        Else
            UstawieniaFabryczne()
        End If
        Me.BackColor = kolorTla
        If zmiennaTrueFalse = True Then
            RadioButton1.Checked = True
        Else
            RadioButton2.Checked = True
        End If
        TextBox1.Text = zmiennaDouble.ToString
        Label3.Text = adresBazyDanych
        'Sprawdza połćzanie z bazą danych, jeśli zostanie połączony zmienia kolor panelu na zielony, jeśli nie to zmienia go na czerwony
        connection.ConnectionString = adresBazyDanych
        Try
            connection.Open()
            Panel1.BackColor = Color.GreenYellow
        Catch ex As Exception
            Panel1.BackColor = Color.Red
        End Try
        connection.Close()
    End Sub

    Private Sub UstawieniaFabryczne()
        Dim path As String = My.Application.Info.DirectoryPath + "\ustawienia.cfg"
        If System.IO.File.Exists(path) Then
            ''Plik istnieje lecz jest uszkodzony
            System.IO.File.Delete(path)
            System.IO.File.Create(My.Application.Info.DirectoryPath + "\ustawienia.cfg").Dispose()
            Dim objWriter As New System.IO.StreamWriter(My.Application.Info.DirectoryPath + "\ustawienia.cfg", True)
            objWriter.WriteLine("150,150,150")
            objWriter.WriteLine(False)
            objWriter.WriteLine(1.54)
            objWriter.WriteLine("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;")
            objWriter.Close()
        Else
            ''Plik nie istnieje
            System.IO.File.Create(My.Application.Info.DirectoryPath + "\ustawienia.cfg").Dispose()
            Dim objWriter As New System.IO.StreamWriter(My.Application.Info.DirectoryPath + "\ustawienia.cfg", True)
            objWriter.WriteLine("150,150,150")
            objWriter.WriteLine(False)
            objWriter.WriteLine(1.54)
            objWriter.WriteLine("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;")
            objWriter.Close()
        End If

        kolorTla = Color.FromArgb(150, 150, 150)
        zmiennaTrueFalse = False
        zmiennaDouble = 1.54
        adresBazyDanych = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Users.mdb;"

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Process.Start(My.Application.Info.DirectoryPath)
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        Dim path As String = My.Application.Info.DirectoryPath + "\ustawienia.cfg"
        If zmiennaTrueFalse = True Then
            Dim lines() As String = System.IO.File.ReadAllLines(path)
            Dim g As Byte = kolorTla.G
            Dim b As Byte = kolorTla.B
            Dim r As Byte = kolorTla.R
            lines(0) = r.ToString + "," + g.ToString + "," + b.ToString
            lines(1) = zmiennaTrueFalse.ToString
            lines(2) = zmiennaDouble.ToString
            lines(3) = adresBazyDanych.ToString
            System.IO.File.WriteAllLines(path, lines)
        Else
            System.IO.File.WriteAllText(path, "")
            Dim objWriter As New System.IO.StreamWriter(path, True)
            Dim g As Byte = kolorTla.G
            Dim b As Byte = kolorTla.B
            Dim r As Byte = kolorTla.R
            objWriter.WriteLine(r.ToString + "," + g.ToString + "," + b.ToString)
            objWriter.WriteLine(zmiennaTrueFalse.ToString)
            objWriter.WriteLine(zmiennaDouble.ToString)
            objWriter.WriteLine(adresBazyDanych.ToString)
            objWriter.Close()
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'Dialog zmiany koloru tła
        ColorDialog1.Color = kolorTla
        Try
            With ColorDialog1
                If .ShowDialog = Windows.Forms.DialogResult.OK Then
                    kolorTla = ColorDialog1.Color
                    Me.BackColor = kolorTla
                End If
            End With
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub RadioButton_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged
        If RadioButton1.Checked = True Then
            zmiennaTrueFalse = True
        Else
            zmiennaTrueFalse = False
        End If
    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        zmiennaDouble = Convert.ToDouble(TextBox1.Text)
    End Sub
End Class

 

 

 

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/adres-bazy-danych-ustawienia-przechowywane-w-pliku-txtcfgini/

Dodaj komentarz

Twój adres email nie będzie publikowany.