Не работают GetPrivateProfileString и WritePrivateProfileString. В MSDN прочитал что надо в реестр чо-то записать. Я записал, WritePrivateProfileString заработал а GetPrivateProfileString нет. Пришлось писать альтернативу, но она работает не так быстро. Как сделать чтобы GetPrivateProfileString заработала??? В MSDN есть API-Reference но там все на C/C++
Вот исходник альтернативы:
Function ReadStr(ByVal linename As String, ByVal FileName As String, ByVal alllines As Boolean) As String
' Создаем StreamReader
Dim LineReader As StreamReader = New StreamReader(FileName)
' Если вообще не загрузилось (маловозможно, но один раз было) то
ReadStr = "Exception"
Try
Dim Line As String
If alllines = False Then
' Если не нашли то
ReadStr = "TxtNotFound"
' Читаем и проверяем записи на нужное значение
' до тех пор пока файл не кончился
Do
Line = LineReader.ReadLine()
If Not linename.Length > Line.Length Then
Dim fff As String = Line.Substring(0, linename.Length)
If linename = fff Then
ReadStr = Line
Exit Do
End If
End If
Loop Until Line Is Nothing
LineReader.Close()
Else
Do
ReadStr = Nothing
Line = LineReader.ReadLine
ReadStr = ReadStr + Line
Loop Until Line Is Nothing
End If
Catch ex As Exception
' Что случилось??
MessageBox.Show("Ошибка чтения файла: " + ex.ToString, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Function
Если не обязательно использовать текстовый файл, то юзай хештабл "hashtable", упрощает поиск, сохраняет данные по принципу "КЛЮЧ" - "ЗНАЧЕНИЕ"
Сохраняется на диск тремя строчками кода "serialization" Если интересно, подкину примеры.
Если не обязательно использовать текстовый файл, то юзай хештабл "hashtable", упрощает поиск, сохраняет данные по принципу "КЛЮЧ" - "ЗНАЧЕНИЕ"
Сохраняется на диск тремя строчками кода "serialization" Если интересно, подкину примеры.
Спасибо, но нужно с ИНИшниками работать.
А зачем тебе понадобились *.ini файлы?
Настройки сохранять, а то ресурсы ReadOnly. Заинтересовался как-то методом писать в exe, но прога же запущена!
Настройки сохранять, а то ресурсы ReadOnly. Заинтересовался как-то методом писать в exe, но прога же запущена!
Ну так и пользуй "hashtable" для сохранения настроек проги, намного удобней, а потом сериализуй на диск в .bin или .xml в зависимости от сериализатора, если нужен пример, дай знать
Никаких HashTable... никаких ini тебе не надо..
В VS 2005 для хранения настроек есть чрезвычайно удобная штука называется она My.Settings.. Без единой строчки кода позволяет хранить практически любые настройки твоей программы..
Ну так и пользуй "hashtable" для сохранения настроек проги, намного удобней, а потом сериализуй на диск в .bin или .xml в зависимости от сериализатора, если нужен пример, дай знать
пример нужен
В VS 2005 для хранения настроек есть чрезвычайно удобная штука называется она My.Settings.. Без единой строчки кода позволяет хранить практически любые настройки твоей программы..
Она кажется ReadOnly. дай ка ссыдку на пример, или выложи на форум
Извиняюсь за задержку, времени небыло на форум залезть
вот пример работы с hashtable
Private Function LoadHashTableFull(ByVal Filename As String) As Hashtable
Dim f As IO.File
If Not f.Exists(Filename) Then Exit Function
Dim ht As New Hashtable
Dim fs As New IO.FileStream(Filename, IO.FileMode.Open)
Dim sc As New Runtime.Serialization.StreamingContext(Runtime.Serialization.StreamingContextStates.File)
Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter(Nothing, sc)
Try
ht = DirectCast(formatter.Deserialize(fs), Hashtable)
If Not ht Is Nothing Then
Return ht
End If
Catch ex As Exception
ExceptionShow(ex)
Return Nothing
Finally
fs.Close()
End Try
End Function
вот функция сохранения пары "ключ - значение"
Public Function SaveToFile(ByVal key As Object, ByVal value As Object, ByVal filename As String) As Boolean
Dim f As IO.File
If Not f.Exists(filename) Then Exit Function
Dim fs As New IO.FileStream(filename, IO.FileMode.OpenOrCreate)
Dim sc As New Runtime.Serialization.StreamingContext(Runtime.Serialization.StreamingContextStates.File)
Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter(Nothing, sc)
Dim ht As Hashtable
Try
ht = LoadHashTableFull(filename)
ht.Add(key, value)
formatter.Serialize(fs, ht)
Return True
Catch ex As Exception
ExceptionShow(ex)
Return False
Finally
fs.Close()
End Try
End Function
а вот эту функцию используй чтобы создать начальный пустой файл перед тем как использовать первых две функции,
Public Function CreateHTFile(ByVal filename As String) As Boolean
Dim f As IO.File
Dim fs As New IO.FileStream(filename, IO.FileMode.OpenOrCreate)
Dim sc As New Runtime.Serialization.StreamingContext(Runtime.Serialization.StreamingContextStates.File)
Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter(Nothing, sc)
Dim ht As New Hashtable
Try
formatter.Serialize(fs, ht)
Return True
Catch ex As Exception
ExceptionShow(ex)
Return False
Finally
fs.Close()
End Try
End Function
можно также использовать SOAP форматтер,
плюсы:
- можно редактировать в текстовом редакторе
- оптимальная передача через HTTP
минусы:
-скорость серилизации в 10 раз меньше бинарного аналога (binaryformatter оччень быстрый)
я все установки прог сохраняю таким методом (привычка с .НЕТ2003)