API-Guide писал(а):Declaration
Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
Parametres
· lpAppName
Points to a null-terminated string containing the name of the section to which the string will be copied. If the section does not exist, it is created. The name of the section is case-independent; the string can be any combination of uppercase and lowercase letters.
· lpKeyName
Points to the null-terminated string containing the name of the key to be associated with a string. If the key does not exist in the specified section, it is created. If this parameter is NULL, the entire section, including all entries within the section, is deleted.
· lpString
Points to a null-terminated string to be written to the file. If this parameter is NULL, the key pointed to by the lpKeyName parameter is deleted.
Windows 95: This platform does not support the use of the TAB (\t) character as part of this parameter.
· lpFileName
Points to a null-terminated string that names the initialization file.
alibek писал(а):Для 100 Мб файла можешь забыть о стандартных API.
Пиши свой класс.
Akuna, потому что они не работают с файлами больше 64Кб, блин. RTFM.
alibek писал(а):GM, ты путаешь с ограничением длины в TextBox.
Option Explicit
' Все функции возвращают True, если нет ошибки
Private mFilename As String
Private AllSections() As tSection
Private Type tValue
Name As String
cntValue As String
End Type
Private Type tSection
Name As String
Values() As tValue
End Type
Public Function RemoveSection(ByVal Section As String) As Boolean
Dim i&, uSN$, a&
uSN = UCase$(Section)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Нужная секция есть, сдвигаем параметры "вниз"
For a = i To UBound(AllSections) - 1
AllSections(a) = AllSections(a + 1)
Next a
' Удаляем
ReDim Preserve AllSections(UBound(AllSections) - 1)
RemoveSection = True
Exit Function
End If
Next i
End Function
Public Property Get SectionExists(ByVal Section As String) As Boolean
Dim i&, uSN$
uSN = UCase$(Section)
' Просто пробежимся по вссем секциям и посмотрим, есть ли заданная
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Есть!
SectionExists = True
Exit Property
End If
Next i
End Property
Public Function UpdateFile() As Boolean
' Имя файла не задано - куда сохранять-то? :)
If Len(mFilename) = 0 Then Exit Function
Dim i&, a&
Open mFilename For Output Access Write Lock Write As #1
For i = 1 To UBound(AllSections)
' Запись всех секций
With AllSections(i)
Print #1, "[" & .Name & "]"
' Запись всех параметров в секции
For a = 1 To UBound(.Values)
Print #1, .Values(a).Name & "=" & .Values(a).cntValue
Next a
End With
Print #1, vbNullString
Next i
Close #1
UpdateFile = True
End Function
Public Property Get ValueExists(ByVal Section As String, ByVal ValueName As String) As Boolean
Dim i&, uSN$, uVN$, a&
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Нужная секция, теперь ищем в ней параметр
For a = 1 To UBound(AllSections(i).Values)
If AllSections(i).Values(a).Name = uVN Then
' Искомый параметр
ValueExists = True
Exit Property
End If
Next a
Exit Property
End If
Next i
End Property
Public Property Get ValueName(ByVal Section As String, ByVal Index As Long) As String
' Примечание: если параметр или секция найдены не будут, то свойство
' вернет vbNullChar - символ с нулевым кодом
Dim uSN$, i&
uSN = UCase$(Section)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
'Нужная секция
If Index > 0 And Index <= UBound(AllSections(i).Values) Then
' Нужный параметр
ValueName = AllSections(i).Values(Index).Name
Exit Property
Else
' Индекс вне границ диапазона...
ValueName = vbNullChar
End If
Exit Property
End If
'End If
ValueName = vbNullChar
Next i
End Property
Public Function RemoveValue(ByVal Section As String, ByVal ValueName As String) As Boolean
Dim i&, a&, uVN$, uSN$, c&
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмор всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Нужная секция есть
For a = 1 To UBound(AllSections(i).Values)
If UCase$(AllSections(i).Values(a).Name) = uVN Then
' Нужный параметр есть
With AllSections(i)
' Сдвиг параметров "вниз" на один
For c = a To UBound(.Values) - 1
.Values(a) = .Values(a + 1)
Next c
' Удаление параметра
ReDim Preserve .Values(UBound(.Values) - 1)
RemoveValue = True
Exit Function
End With
End If
Next
Exit Function
End If
Next i
End Function
Public Function AddValue(ByVal Section As String, ByVal ValueName As String, Optional ByVal lValue As String = vbNullString) As Boolean
Dim uSN$, i&, uVN$, a&
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотрим-ка все секции...
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
add_value:
' Есть нужная секция!
For a = 1 To UBound(AllSections(i).Values)
If UCase$(AllSections(i).Values(a).Name) = uVN Then
' Такая строка уже есть
Exit Function
End If
Next a
' Добавляем новый параметр
With AllSections(i)
ReDim Preserve .Values(UBound(.Values) + 1)
.Values(UBound(.Values)).Name = ValueName
.Values(UBound(.Values)).cntValue = lValue
End With
AddValue = True
Exit Function
End If
Next i
' Секции такой нет, добавляем...
AddSection Section
GoTo add_value
End Function
Public Property Get ValuesCount(ByVal Section As String) As Long
' Примечание: если секция не найдена, свойство вернет
' значение -1.
Dim uSN$, i&
uSN = UCase$(Section)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Нужная секция
ValuesCount = UBound(AllSections(i).Values)
Exit Property
End If
'End If
ValuesCount = -1
Next i
End Property
Public Property Let Value(ByVal Section As String, ByVal ValueName As String, ByVal vData As String)
Dim i&, a&, uVN$, uSN$
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Просмотр параметров в секции
For a = 1 To UBound(AllSections(i).Values)
If UCase$(AllSections(i).Values(a).Name) = uVN Then
' Нашли параметр, обновляем его значение...
AllSections(i).Values(a).cntValue = vData
Exit Property
End If
Next
' Не нашли параметр, добавляем новый...
With AllSections(i)
ReDim Preserve .Values(UBound(.Values) + 1)
.Values(UBound(.Values)).cntValue = vData
.Values(UBound(.Values)).Name = ValueName
End With
Exit Property
End If
Next i
' Не нашли соотвествующую секцию, добавляем новую...
ReDim Preserve AllSections(UBound(AllSections) + 1)
With AllSections(UBound(AllSections))
.Name = Section
ReDim .Values(1)
.Values(1).Name = ValueName
.Values(1).cntValue = vData
End With
End Property
Public Property Get Value(ByVal Section As String, ByVal ValueName As String) As String
' Примечание: если параметр найден не будет, то свойство
' вернет vbNullChar - символ с нулевым кодом
Dim i&, a&, uVN$, uSN$
uSN = UCase$(Section)
uVN = UCase$(ValueName)
' Просмотр всех секций
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Просмотр всех параметров в секции
For a = 1 To UBound(AllSections(i).Values)
If UCase$(AllSections(i).Values(a).Name) = uVN Then
' Нашли нужный параметр
Value = AllSections(i).Values(a).cntValue
Exit Property
End If
Next
Value = vbNullChar
Exit Property
End If
Next i
Value = vbNullChar
End Property
Public Property Get SectionName(ByVal Index As Long) As String
' Здесь все просто: проверка - попадает ли индекс в границы
' массива и возврат имени секции.
' Примечание: если секция найдена не будет, то свойство
' вернет vbNullChar - символ с нулевым кодом
If Index > 0 And Index <= UBound(AllSections) Then
SectionName = AllSections(Index).Name
Else
SectionName = vbNullChar
End If
End Property
Public Function AddSection(ByVal Section As String) As Boolean
Dim uSN$, i&
uSN = UCase$(Section)
For i = 1 To UBound(AllSections)
If UCase$(AllSections(i).Name) = uSN Then
' Уже такая секция есть...
Exit Function
End If
Next i
' Добавляем элемент к массиву секций
ReDim Preserve AllSections(UBound(AllSections) + 1)
With AllSections(UBound(AllSections))
.Name = Section
ReDim .Values(0)
End With
AddSection = True
End Function
Public Property Get SectionsCount() As Long
SectionsCount = UBound(AllSections)
End Property
Public Property Let FileName(ByVal vData As String)
Dim s&, v&, l$, t&
mFilename = vData
ReDim AllSections(0)
' Файл в наличии?
If Len(Dir(mFilename)) = 0 Then
' Если нет, то...
Exit Property
End If
' Считываем файл
Open mFilename For Input Access Read Lock Write As #1
Do While Not EOF(1)
Line Input #1, l
' Комментарии есть?
t = InStr(1, l, ";")
l = LTrim$(RTrim$(l))
' Откомментирована вся строка
If t = 1 Or Len(l) = 0 Then GoTo skip_line
' Комментарии в конце строки
If t > 1 Then l = Left$(l, t - 1)
If Left$(l, 1) = "[" Then
' Нашли секцию
t = InStr(1, l, "]")
If t < 3 Then GoTo skip_line
l = Mid$(l, 2, t - 2)
' Секций стало на одну больше
s = s + 1
' Строк в новой секции пока нет
v = 0
ReDim Preserve AllSections(s)
AllSections(s).Name = l
ReDim AllSections(s).Values(0)
Else
' Нашли параметр в секцию
' Если ранеее не было найдено ни одной секции - пропускаем
If s = 0 Then GoTo skip_line
' Разделяем строку на название параметра и на его значение
t = InStr(1, l, "=")
If t < 2 Then GoTo skip_line
v = v + 1
' Добавляем параметр
With AllSections(s)
ReDim Preserve .Values(v)
.Values(v).Name = Left$(l, t - 1)
If t < Len(l) Then .Values(v).cntValue = Mid$(l, t + 1, Len(l) - t)
End With
End If
skip_line:
Loop
Close #1
End Property
Public Property Get FileName() As String
FileName = mFilename
End Property
Private Sub Class_Initialize()
ReDim AllSections(0)
End Sub
Private Sub Class_Terminate()
ReDim AllSections(0)
End Sub
alibek писал(а):Для 100 Мб файла можешь забыть о стандартных API.
Пиши свой класс.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 83