Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: и снова старый добрый INI Добавлено: 27.10.06 07:12  

Автор вопроса:  mr_Frank | Web-сайт: subaru.nv-avto.ru | ICQ: 316417 
Здраствуйте товаристчи програмёры! :)
Честно сознаюсь яне знаю как обьяснить суть моего вопроса на русском языке, поэтому покажу буквально на пальцах

вот обычное строение ини файла:

[general]
key=string
key2=string2
key3=string3

[general1]
key=string

[general2]

...


в общем мне нужно в массив к примеру sTemp() получть список всех [general] [general1] [general2] и т.д.
подскажите какой модуль лучше скачать для этого. и какой функцией в моделу воспользоватся для этого.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 mr_Frank



ICQ: 316417 

Вопросов: 36
Ответов: 94
 Web-сайт: subaru.nv-avto.ru
 Профиль | | #1
Добавлено: 27.10.06 07:12
Надеюсь вопрос более менее понятен ;)

Ответить

Номер ответа: 2
Автор ответа:
 Nonamer



ICQ: 268674940 

Вопросов: 31
Ответов: 69
 Web-сайт: nonsoft.narod.ru
 Профиль | | #2
Добавлено: 27.10.06 09:50
Вопрос наверно понятен ... :)
Ответ следующий:
Тебе надо немного изменить твой ИНИ на примерно вот такой:

[Main]
gCount=3 ;Например три
[general1]
keyCount=3 ;Например три
key1=string
key2=string2
key3=string3

[general2]
keyCount=1
key1=string

[general3]
keyCount= ...
...

Сначала ты читаеш из МАИН сколько у тебя general,
а потом по циклу перебираешь их как strSection=general & i, а уже внутри этого цикла ты читаешь keyCount и по другому циклу точно также перебираешь key (strKey=key & i).

Модуль для работы с ини можно найти на этом сайте или скачать отсюда: http://nonsoft.narod.ru/mini.zip

Ответить

Номер ответа: 3
Автор ответа:
 mr_Frank



ICQ: 316417 

Вопросов: 36
Ответов: 94
 Web-сайт: subaru.nv-avto.ru
 Профиль | | #3
Добавлено: 27.10.06 10:06
нет, сматри, ини будет состоять вот так
кол-во генеральных разделов будет разным, а кол-во ключей везде одинаковым, и названияодинаковые

Ответить

Номер ответа: 4
Автор ответа:
 mr_Frank



ICQ: 316417 

Вопросов: 36
Ответов: 94
 Web-сайт: subaru.nv-avto.ru
 Профиль | | #4
Добавлено: 27.10.06 10:07
все догнал что ты имеешь введу %) спасибо!

Ответить

Номер ответа: 5
Автор ответа:
 SyavX



Вопросов: 25
Ответов: 149
 Профиль | | #5 Добавлено: 27.10.06 21:39
То, что предложил Nonamer подойдет, если имена секций "одинаковы" (section1, section2, ...). Вот простой пример получения имен всех секций, вне зависимости от имени (лишь бы в именах не было запятых):
Dim SectionsArr() As String
'...
Private Sub GetINISections(FilePath As String)
Dim i As Integer

    Open FilePath For Input As #1
        Do While Not (EOF(1))
            ReDim Preserve SectionsArr(0 To i)
            Input #1, SectionsArr(i)
        If Left$(SectionsArr(i), 1) = "[" And Right$(SectionsArr(i), 1) = "]" Then i = i + 1
        'If Left$(SectionsArr(i), 1) = "[" And Right$(SectionsArr(i), 1) = "]" Then i = i + 1
        Loop
    Close #1
End Sub

В результате массив SectionsArr содержит имена всех секций из указанного файла. Дальше распоряжайся ими как хочешь...

Ответить

Номер ответа: 6
Автор ответа:
 SyavX



Вопросов: 25
Ответов: 149
 Профиль | | #6 Добавлено: 27.10.06 21:45
Э-э-э, малость не то скопировал/исправил...
Вот то, что надо:
Dim SectionsArr() As String
'...
Private Sub GetINISections(FilePath As String)
Dim tmp As String
Dim i As Integer

    Open FilePath For Input As #1
        Do While Not (EOF(1))
            Input #1, tmp
            If Left$(tmp, 1) = "[" Then
            'If Left$(tmp, 1) = "[" And Right$(tmp, 1) = "]" Then i = i + 1
                ReDim Preserve SectionsArr(0 To i)
                SectionsArr(i) = tmp
                i = i + 1
            End If
        Loop
    Close #1
End Sub

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 28.10.06 01:12
Option Explicit
Option Compare Text

'********************************************************************
'*            Написано 12.03.2004 году (Team HomeWork)              *
'*                   e-mail: sne_pro[сабака!]mail.ru                        *
'********************************************************************
'*                                                                  *
'*    Работа с ini файлами, аналогичная работе с реестром Windows   *
'*                                                                  *
'********************************************************************

Private Declare Function GetPrivateProfileInt Lib "kernel32.dll" Alias "GetPrivateProfileIntA" (ByVal strSection As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileSection Lib "kernel32.dll" Alias "GetPrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileSectionNames Lib "kernel32.dll" Alias "GetPrivateProfileSectionNamesA" (ByVal lpszReturnBuffer As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
'Private Declare Function GetPrivateProfileStruct Lib "kernel32.dll" Alias "GetPrivateProfileStructA" (ByVal lpszSection As String, ByVal lpszKey As String, lpStruct As Any, ByVal uSizeStruct As Long, ByVal szFile As String) As Long

Private Declare Function WritePrivateProfileSection Lib "kernel32.dll" Alias "WritePrivateProfileSectionA" (ByVal lpAppName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
'Private Declare Function WritePrivateProfileStruct Lib "kernel32.dll" Alias "WritePrivateProfileStructA" (ByVal lpszSection As String, ByVal lpszKey As String, lpStruct As Any, ByVal uSizeStruct As Long, ByVal szFile As String) As Long

Private Declare Function WPPStrToDelKey Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal strSection As String, ByVal lpKeyName As String, ByVal lpString As Long, ByVal lplFileName As String) As Long
Private Declare Function WPPSToDelSec Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal strSection As String, ByVal lpKeyName As Long, ByVal lpString As Long, ByVal lplFileName As String) As Long

Private Declare Function DeleteFile Lib "kernel32.dll" Alias ";DeleteFileA" (ByVal lpFileName As String) As Long

Public Type gbHWIniExRetData
    sKeyName As String
    sValue   As String
End Type

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  SetValue
' Описание   :  Установка строкового значения
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               sKeyName    - Имя ключа
'               sValue      - Значение
'--------------------------------------------------------------------------------
Public Sub SetValue(ByVal sFileName As String, _
                    ByVal sSectName As String, _
                    ByVal sKeyName As String, _
                    ByVal sValue As String)

    Call WritePrivateProfileString(VerDblSlash(sSectName, False), sKeyName, sValue, sFileName)
End Sub

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  SetDWord
' Описание   :  Установка численного значения
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               sKeyName    - Имя ключа
'               lValue      - Значение
'--------------------------------------------------------------------------------
Public Sub SetDWord(ByVal sFileName As String, _
                    ByVal sSectName As String, _
                    ByVal sKeyName As String, _
                    ByVal lValue As Long)

    Call WritePrivateProfileString(VerDblSlash(sSectName, False), sKeyName, Str$(lValue), sFileName)
End Sub

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  SetKey
' Описание   :  Создание пустой секции
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'--------------------------------------------------------------------------------
Public Sub SetKey(ByVal sFileName As String, _
                  ByVal sSectName As String)

    Call WritePrivateProfileSection(VerDblSlash(sSectName, False), "", sFileName)
End Sub

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  GetValue
' Описание   :  Получение строкового значения
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               sKeyName    - Имя ключа
'               sDefault    - Значение по умолчанию
'               lMaxSize    - Максимальная длинна строки
'--------------------------------------------------------------------------------
Public Function GetValue(ByVal sFileName As String, _
                         ByVal sSectName As String, _
                         ByVal sKeyName As String, _
                Optional ByVal sDefault As String = vbNullString, _
                Optional ByVal lMaxSize As Long = &H400&;) As String
    Dim slength As Long

    GetValue = String$(lMaxSize, &H0)
    slength = GetPrivateProfileString(VerDblSlash(sSectName, False), sKeyName, sDefault, GetValue, lMaxSize, sFileName)
    GetValue = Left$(GetValue, slength)
End Function

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  GetDword
' Описание   :  Получение числового значения
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               sKeyName    - Имя ключа
'               lDefault    - Значение по умолчанию
'--------------------------------------------------------------------------------
Public Function GetDword(ByVal sFileName As String, _
                         ByVal sSectName As String, _
                         ByVal sKeyName As String, _
                Optional ByVal lDefault As Long = 0&;) As Long

    GetDword = GetPrivateProfileInt(VerDblSlash(sSectName, False), sKeyName, lDefault, sFileName)
End Function

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  GetKeys
' Описание   :  Получение секций (подсекций секции)
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName       - Имя ИНИ файла
'               sSectName       - Имя секции
'               strRetArray()   - Массив для возврата значений
'               lMaxSize        - Максимальный размер
'--------------------------------------------------------------------------------
Public Function GetKeys(ByVal sFileName As String, _
                        ByVal sSectName As String, _
                        ByRef strRetArray() As String, _
               Optional ByVal lMaxSize As Long = &H1000&;) As Long

    Dim sBuffer As String, tArray() As String, ii As Long, lLen As Long, lSl As Long

    sBuffer = String$(lMaxSize, &H0)
    Erase strRetArray

    GetKeys = GetPrivateProfileSectionNames(sBuffer, lMaxSize, sFileName)

    If Not GetKeys > vbNull Then GetKeys = &HFFFF: Exit Function

    sBuffer = Left$(sBuffer, GetKeys - vbNull)
    tArray = Split(sBuffer, vbNullChar)

    sSectName = VerDblSlash(sSectName, True)
    lLen = Len(sSectName)

    If lLen = 0& Then
        strRetArray = tArray
        GetKeys = UBound(tArray)
    Else
        GetKeys = &HFFFF

        For ii = 0 To UBound(tArray)
            If sSectName = Left$(tArray(ii), lLen) Then
                lSl = InStr(lLen + 2, tArray(ii), "\";)

                If lSl = 0 Or lSl = Len(tArray(ii)) Then
                    GetKeys = GetKeys + vbNull
                    ReDim Preserve strRetArray(GetKeys)

                    strRetArray(GetKeys) = Mid$(tArray(ii), lLen + vbNull)
                End If
            End If
        Next
    End If

    Erase tArray
End Function

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  GetKeyValues
' Описание   :  Получение имен и значений ключей в секции
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName       - Имя ИНИ файла
'               sSectName       - Имя секции
'               strRetArray()   - Массив для возврата значений
'               lMaxSize        - Максимальный размер
'--------------------------------------------------------------------------------
Public Function GetKeyValues(ByVal sFileName As String, _
                             ByVal sSectName As String, _
                             ByRef strRetArray() As gbHWIniExRetData, _
                    Optional ByVal lMaxSize As Long = &H1000&;) As Long

    Dim sBuffer As String, tArray() As String, ii As Long

    sBuffer = String$(lMaxSize, &H0)
    Erase strRetArray

    GetKeyValues = GetPrivateProfileSection(VerDblSlash(sSectName, False), sBuffer, lMaxSize, sFileName)

    If Not GetKeyValues > 1& Then GetKeyValues = &HFFFF: Exit Function

    sBuffer = Left$(sBuffer, GetKeyValues - vbNull)
    tArray = Split(sBuffer, vbNullChar)

    ReDim strRetArray(UBound(tArray))
    For ii = 0 To UBound(tArray)
        strRetArray(ii).sKeyName = Split(tArray(ii), "=";)(0)
        strRetArray(ii).sValue = Split(tArray(ii), "=";)(1)
    Next

    Erase tArray
    GetKeyValues = UBound(strRetArray)
End Function

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  ;DeleteValue
' Описание   :  Удаление ключа в секции
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               sKeyName    - Имя ключа
'--------------------------------------------------------------------------------
Public Sub DeleteValue(ByVal sFileName As String, _
                       ByVal sSectName As String, _
                       ByVal sKeyName As String)

    Call WPPStrToDelKey(VerDblSlash(sSectName, False), sKeyName, 0&, sFileName)
End Sub

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  ;DeleteKey
' Описание   :  Удаление одной секции, независимо от того содержатся ли в ней подсекции
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               bWthSubKeys - Удалять-ли подсекции
'--------------------------------------------------------------------------------
Public Sub DeleteKey(ByVal sFileName As String, _
                     ByVal sSectName As String, _
            Optional ByVal bWthSubKeys As Boolean = True)
    Dim SubKeys() As String, i_r As Long

    If bWthSubKeys Then
        For i_r = 0 To GetKeys(sFileName, sSectName, SubKeys)
            Call WPPSToDelSec(VerDblSlash(SubKeys(i_r), False), 0&, 0&, sFileName)
        Next
    End If

    Call WPPSToDelSec(VerDblSlash(sSectName, False), 0&, 0&, sFileName)
End Sub

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  CopyKeyValues
' Описание   :  Запись ключей и их значений в секции
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName       - Имя ИНИ файла
'               sFromSection    - Имя секции с которой копируем
'               sToSection      - Имя секции в которую копируем
'               lMaxSize        - Максимальный размер данных
'--------------------------------------------------------------------------------
Public Sub CopyKeyValues(ByVal sFileName As String, _
                         ByVal sFromSection As String, _
                         ByVal sToSection As String, _
                Optional ByVal lMaxSize As Long = &H1000&;)
    Dim lLen As Long, sBuffer As String

    sBuffer = sBuffer = String$(lMaxSize, &H0)
    lLen = GetPrivateProfileSection(VerDblSlash(sFromSection, False), sBuffer, lMaxSize, sFileName)

    If Not lLen > 1& Then Exit Sub
    sBuffer = Left$(sBuffer, lLen)

    Call WritePrivateProfileSection(sToSection, sBuffer, sFileName)
End Sub

' §§§§§§§§§§§§§§§§§§§§§§§§§§ Пара функций без АПИ, но очень нужных в работе §§§§§§§§§§§§§§§§§§§§§§§§§§

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  RenameKey
' Описание   :  Переименование секции
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя ИНИ файла
'               sSectName   - Имя секции
'               sNewSName   - Новое имя секции
'--------------------------------------------------------------------------------
Public Sub RenameKey(ByVal sFileName As String, _
                     ByVal sSectName As String, _
                     ByVal sNewSName As String)
    Dim nf As Long, sBuffer As String, slArray() As String
    nf = FreeFile

    If FileLen(sFileName) = 0& Then Exit Sub

    Open sFileName For Binary Access Read Lock Write As nf
        sBuffer = String$(LOF(nf), 0&;)
        Get nf, 1, sBuffer
    Close nf

    slArray = Split(sBuffer, vbCrLf)
    For nf = 0 To UBound(slArray)
        If slArray(nf) = Chr$(&H5B) & sSectName & Chr$(&H5D) Then slArray(nf) = Chr$(&H5B) & sNewSName & Chr$(&H5D)
    Next
    sBuffer = Join(slArray, vbCrLf)

    nf = FreeFile
    Open sFileName For Binary Access Write Lock Read As nf
        Put nf, 1, sBuffer
    Close nf

    Erase slArray
End Sub

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  NormFile
' Описание   :  Привидение ини файла в "читабельный" вид
' Кем создан :  SNE
' Дата-Время :  08.11.2004-17:44:28
'
' Параметры  :  sFileName   - Имя файла
'--------------------------------------------------------------------------------
Public Sub NormFile(sFileName As String)
    Dim nf As Long, ub As Long, sBuffer As String, slArray() As String, sOutArray() As String
    nf = FreeFile

    If FileLen(sFileName) = 0& Then Exit Sub

    Open sFileName For Binary Access Read Lock Write As nf
        sBuffer = String$(LOF(nf), 0&;)
        Get nf, 1, sBuffer
    Close nf

    slArray = Split(sBuffer, vbCrLf)
    ub = &HFFFF

    For nf = 0 To UBound(slArray)
        If Len(slArray(nf)) Then
            ub = ub + IIf(Left$(slArray(nf), vbNull) = Chr$(&H5B), 2, vbNull)

            ReDim Preserve sOutArray(ub)
            sOutArray(ub) = slArray(nf)
        End If
    Next
    sBuffer = Join(sOutArray, vbCrLf)
    Call DeleteFile(sFileName)

    nf = FreeFile
    Open sFileName For Binary Access Write Lock Read As nf
        Put nf, 1, sBuffer
    Close nf
End Sub

' §§§§§§§§§§§§§§§§§§§§§§§§§§ Вспомогательное добро §§§§§§§§§§§§§§§§§§§§§§§§§§

    ' Добавление/Удаление слэша на конце
Private Function VerDblSlash(ByVal sInSection As String, _
                    Optional ByVal bFlag As Boolean = False) As String

    If Len(sInSection) = 0& Then Exit Function

    If bFlag Then
        VerDblSlash = IIf(Right$(sInSection, vbNull) = "\", sInSection, sInSection & "\";)
    Else
        VerDblSlash = IIf(Right$(sInSection, vbNull) = "\", Left$(sInSection, Len(sInSection) - vbNull), sInSection)
    End If
End Function

Ответить

Номер ответа: 8
Автор ответа:
 SyavX



Вопросов: 25
Ответов: 149
 Профиль | | #8 Добавлено: 28.10.06 02:34
Исходники sne, как обычно, рулят ;)

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 29.10.06 00:43
Ну да, без sne ведь api пользоваться страшное дело :) а msdn вообще непонятно зачем оно...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам