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..
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
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 |