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.
WitamNie 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..
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
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
Są to ustawienia domyślne jakie narzucimy z góry przy pierwszym uruchomieniu programu. Bierzemy pod uwagę w tym wypadku dwie opcje: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
Drugi 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: 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:
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




