Редактирование ини

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Редактирование ини

Сообщение Akuna » 01.11.2005 (Вт) 10:51

Всем доброе время суток.
Простите если повторяюсь но поюзав поиск так и не нашел нужного.

Помогите разобраться с такой проблемой.
есть фаил с таким содержанием:

[OBJECT]
LEVEL=2

[OBJECT]
LEVEL=1

[OBJECT]
LEVEL=2

как написать цикл что бы удалить все блоки из файла с
ключем LEVEL и его переменной = 1
а остальные оставить?

Буду оочень благодарен за помощь.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 01.11.2005 (Вт) 15:04

А чего их удалять?
пиши с помощью WritePrivateProfileString пустую строку.

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 01.11.2005 (Вт) 16:06

прости. я не профи))
только начинающий

всмысле пустую строку?

как мне пройти по всему фаилу и удалить только те блоки
у которых ключи равены проверяемой мной переменной?)

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 01.11.2005 (Вт) 18:22

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.

Ну а считать значение ключа, насколько я понимаю, для тебя труда не составит (как то же ты с этим INI работаешь?).
Листинги не горят!

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 01.11.2005 (Вт) 21:10

"(как то же ты с этим INI работаешь?)."

ай?

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 01.11.2005 (Вт) 21:20

блин... все равно не понимаю как удалить из 100 списка
подобных блоков
парочку нужных мне...

без цикла?

можно примерчик??
я бы был ооочень благодарен

Grimm
Новичок
Новичок
Аватара пользователя
 
Сообщения: 43
Зарегистрирован: 24.10.2005 (Пн) 0:17

Сообщение Grimm » 02.11.2005 (Ср) 1:07

он тебе вставил описание API функции, переведи на русский и будет тебе счастье, а пока переводишь почитай мой код для тебя.

Private Sub FileChange()
Dim FileNum1 As Integer
Dim FileNum2 As Integer
Dim TempStr1 As String
Dim TempStr2 As String
Dim TempStr3 As String
Dim Path1 As String
Dim Path2 As String
Dim FSO As Object
Dim File1 As Object


Set FSO = CreateObject("Scripting.FileSystemObject")

FileNum1 = FreeFile
Path1 = App.Path & "\test.txt"
Path2 = App.Path & "\temp.txt"

If Len(Dir(Path2)) > 0 Then
Set File1 = FSO.getfile(Path2)
File1.Delete
End If


Open Path1 For Input As FileNum1
Do Until EOF(FileNum1)
Line Input #FileNum1, TempStr1
Line Input #FileNum1, TempStr2
Line Input #FileNum1, TempStr3

If (Trim$(TempStr2) <> "LEVEL=1") Then
FileNum2 = FreeFile
Open Path2 For Append As FileNum2
Print #FileNum2, TempStr1
Print #FileNum2, TempStr2
Print #FileNum2, TempStr3
Close FileNum2
End If

Loop
Close FileNum1


Set File1 = FSO.getfile(Path1)
File1.Delete

Set File1 = FSO.getfile(Path2)
File1.Move (Path1)

End Sub
Я слишком рано стал ребенком

Grimm
Новичок
Новичок
Аватара пользователя
 
Сообщения: 43
Зарегистрирован: 24.10.2005 (Пн) 0:17

Сообщение Grimm » 02.11.2005 (Ср) 1:12

теперь комменты:

1. Предполагается что исходный файл test.txt нахходится в папке с приложением.

2. Сначала проверяетс яналичие temp.txt, сли он есть - его удаление, но это лишнее, можно стереть.

Далее идет открытие файла, чтение по 3 строки (предполагается что первая строка в файле пустая, все параметры идут комплектами по трис строки 1) - пустая, 2) - [OBJECT], 3) - LEVEL=... - обязательно поставь в файде первую строку - пустую.)

3. Если считанная строка 3) не "LEVEL=1", тогда открываем второй файл и пишем в него.

4. Удаляем старый файл, переименовываем новый.

Вопросы точно будут, если не захочешь тупо скопировать.
Я слишком рано стал ребенком

Grimm
Новичок
Новичок
Аватара пользователя
 
Сообщения: 43
Зарегистрирован: 24.10.2005 (Пн) 0:17

Сообщение Grimm » 02.11.2005 (Ср) 1:15

ЛОЛ, я неправильно написал насчет комплектов строк


1) - [OBJECT], 2) - LEVEL=... , 3) - пустая, в файле не первая строчка пустая, а последняя, например

----------
[OBJECT]
LEVEL=2

[OBJECT]
LEVEL=1

[OBJECT]
LEVEL=2

[OBJECT]
LEVEL=1

[OBJECT]
LEVEL=2

---------
Я слишком рано стал ребенком

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 02.11.2005 (Ср) 10:54

аха... вопросов нет т.к с обычным открытием файлов я хорошо знаком ;))
(можно было и полегче сделать впринципе то)
большое спасибо конечно за (почти) детальный разбор. :)

я думал таким способом сделать
но как то получится долго
т.к файл весит (это из игры) около 100мб
и выше...


мне бы очень хотелось узнать как при помощи функций
ИНИ редактирования (незнаю как правильно выразиться)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.11.2005 (Ср) 11:02

Для 100 Мб файла можешь забыть о стандартных API.
Пиши свой класс.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.11.2005 (Ср) 11:45

alibek писал(а):Для 100 Мб файла можешь забыть о стандартных API.
Пиши свой класс.

...или найди уже написанный ;-)
На vbrussian.com вроде был один.
Изображение

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 02.11.2005 (Ср) 12:51

почему забыть? )

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.11.2005 (Ср) 13:21

Akuna, потому что они не работают с файлами больше 64Кб, блин. RTFM.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 02.11.2005 (Ср) 15:25

Akuna, потому что они не работают с файлами больше 64Кб, блин. RTFM.

Если не ошибаюсь, в WinNT снято такое ограничение, или нет?
الفيجوال بيسك الرابح

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.11.2005 (Ср) 15:44

GM, ты путаешь с ограничением длины в TextBox.
Lasciate ogni speranza, voi ch'entrate.

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 02.11.2005 (Ср) 17:31

мм... пасиб всем.

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 02.11.2005 (Ср) 19:27

а вот вот еще вопросик.
скачал этот класс с vbrussian.com.

он подойдет для меня? :roll:

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 02.11.2005 (Ср) 20:37

alibek писал(а):GM, ты путаешь с ограничением длины в TextBox.

Нет, не из-за этого. Я почему-то был очень уверен что ограничение было снято, где-то криво прочитал. :?
الفيجوال بيسك الرابح

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 13.11.2005 (Вс) 22:28

Код: Выделить всё
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


Вот класс, что дальше? )) как его модифицировать под то что мне нужно
или как правильно работать
что бы добиться нужного мне результата

Firestorm
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 946
Зарегистрирован: 02.05.2002 (Чт) 14:36
Откуда: Russia

Сообщение Firestorm » 17.11.2005 (Чт) 3:28

alibek писал(а):Для 100 Мб файла можешь забыть о стандартных API.
Пиши свой класс.

дааавно помню маился с такой проблемой...так её неск. лет наазад не поборол, и сдался :lol:
...просто гламурный падонак...
_________________
reborn! v.2 :twisted:
_________________

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 18.11.2005 (Пт) 14:30

а я все сделал ;))
если хотите могу кодик выложить!

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 18.11.2005 (Пт) 14:31

а я все сделал ;))
если хотите могу кодик выложить!

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 18.11.2005 (Пт) 14:34

а я все сделал ;))
если хотите могу кодик выложить!

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 18.11.2005 (Пт) 14:36

а я все сделал ;))
если хотите могу кодик выложить!

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 18.11.2005 (Пт) 14:45

а я все сделал ;))
если хотите могу кодик выложить!

Akuna
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 01.11.2005 (Вт) 10:45

Сообщение Akuna » 18.11.2005 (Пт) 14:46

чо за глюки


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 201

    TopList  
cron