Justin Pitera Ответов: 1

Как настроить считыватель ini-файлов так, как описано в задаче? Пожалуйста, помогите?


Я в принципе хочу посмотреть список, чтобы прочитать содержимое ini файл под названием "mods".ini и в нем, чтобы быть в состоянии проверить или снимите флажок основе + или - в ini.

Что я уже пробовал:

Приведенный ниже код работает следующим образом:
В каталоге приложений есть папка под названием Profiles, внутри которой находится еще одна папка с именем профиля. наконец, внутри этой папки находится ini-файл. Этот ini-файл записывается следующим образом :
[Mods]
+=extendedtimeline.zip
-=BetterGraphicalImprovementsMod.zip
+=RuleTheWaves.zip
-=edfae.zip



Вот тут-то и начинаются проблемы.

Когда ini-файл загружен, я хочу, чтобы он проверял или снимал флажки с входящих элементов, как указано в ini-файле. (+ означает проверено, - означает непроверено)


Проблема:
Теперь этот код работает хорошо, он действительно добавляет каждую строку в представление списка, однако когда приходит время проверить или снять галочку:
ListView1.Items.Item(0).Checked = True
все испортит. Этот код будет проверять только первый элемент в списке (из-за.Item (0)) Итак, как бы я сделал это для каждого элемента в списке?



Public Sub LoadMods()
    ListView1.Clear()
    Try
        Dim objReader As New System.IO.StreamReader(My.Application.Info.DirectoryPath + "/profiles/" + ListBox1.SelectedItem.ToString + "/mods.ini", System.Text.Encoding.Default)
        Do While objReader.Peek() <> -1
            row = objReader.ReadLine()
            If LCase(row) = "[" & LCase(section) & "]" Then
                match = True
            ElseIf match AndAlso Trim(row) <> "" AndAlso Mid(row, 1, 1) <> "[" Then
                Dim data() As String = Split(row, "=")
                Dim enabledyes = data(0)
                Dim path = data(1)

                Debug.Print(Name & "=" & path)
                ListView1.Items.Add(path) '& "=" & value
                If enabledyes = "+" Then
                    ListView1.Items.Item(0).Checked = True
                End If
            Else
                match = False
            End If


        Loop
        objReader.Close()
    Catch ex As Exception

    End Try


End Sub

1 Ответов

Рейтинг:
1

Graeme_Grant

Почему Ini-файл? формат JSON[^ в наши дни это намного проще...

Кроме того, прошло уже некоторое время с тех пор, как я работал с INI-файлами, но, согласно Спецификация файла ini - Википедия[^], вы не можете использовать кратные числа одного и того же ключа. Итак, это:

[Mods]
+=extendedtimeline.zip
-=BetterGraphicalImprovementsMod.zip
+=RuleTheWaves.zip
-=edfae.zip

Нужно изменить что-то вроде:
[Mods]
file1=extendedtimeline.zip,+
file2=BetterGraphicalImprovementsMod.zip,-
file3=RuleTheWaves.zip,+
file4=edfae.zip,-

Если вы решите работать с JSON, в этой статье есть класс JsonHelper, который преобразуется в / из класса / text(file): Работа с JSON в C# и VB[^]

ОБНОВЛЕНИЕ: Вот как это выглядело бы, если бы вы перешли на JSON и использовали вспомогательный класс по ссылке выше:

1. Файл config :
{
    "Mods": {
        "Files": [{
            "Name": "extendedtimeline.zip",
            "IsActive": true
        },
        {
            "Name": "BetterGraphicalImprovementsMod.zip",
            "IsActive": false
        },
        {
            "Name": "RuleTheWaves.zip",
            "IsActive": true
        },
        {
            "Name": "edfae.zip",
            "IsActive": false
        }]
    }
}

2. В структуре класса :
Class Settings
    Public Property Mods As ModFiles
    ' other sections go here....
End Class

Class ModFiles
    Public Property Files As List(Of ModFile)
End Class

Class ModFile
    Public Property Name As String
    Public Property IsActive As Boolean
End Class

3. и код для чтения / записи конфигурационного файла:
Imports Newtonsoft.Json

Module Module1

    Private settingsFilename As String = "Settings.Json"
    Private ReadOnly appPath As String = Environment.CurrentDirectory
    Private ReadOnly fullPath As String = IO.Path.Combine(appPath, settingsFilename)

    Private Property AppSettings() As Settings

    Sub Main()

        If IO.File.Exists(fullPath) Then
            Dim rawJson = IO.File.ReadAllText(fullPath)
            AppSettings = JsonHelper.ToClass(Of Settings)(rawJson)
        Else
            AppSettings = New Settings() With {
                    .Mods = New ModFiles() With {
                        .Files = New List(Of ModFile)() From {
                            New ModFile() With {
                                .Name = "extendedtimeline.zip",
                                .IsActive = True},
                            New ModFile() With {
                                .Name = "BetterGraphicalImprovementsMod.zip"},
                            New ModFile() With {
                                .Name = "RuleTheWaves.zip",
                                .IsActive = True},
                            New ModFile() With {
                                .Name = "edfae.zip"}
                        }
                    }
                }

            Dim rawJson = JsonHelper.FromClass(AppSettings)
            IO.File.WriteAllText(fullPath, rawJson)
        End If

        ' check values are read from file using IntelliSense or locals debug window
        Debugger.Break() 

    End Sub

End Module