2014-11-08 54 views
0

我設法得到一個寫入和讀取INI文件的類。下面是它的代碼:如何閱讀每個.ini部分

Public Class IniFile 
' API functions 
Private Declare Ansi Function GetPrivateProfileString _ 
    Lib "kernel32.dll" Alias "GetPrivateProfileStringA" _ 
    (ByVal lpApplicationName As String, _ 
    ByVal lpKeyName As String, ByVal lpDefault As String, _ 
    ByVal lpReturnedString As System.Text.StringBuilder, _ 
    ByVal nSize As Integer, ByVal lpFileName As String) _ 
    As Integer 
Private Declare Ansi Function WritePrivateProfileString _ 
    Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _ 
    (ByVal lpApplicationName As String, _ 
    ByVal lpKeyName As String, ByVal lpString As String, _ 
    ByVal lpFileName As String) As Integer 
Private Declare Ansi Function GetPrivateProfileInt _ 
    Lib "kernel32.dll" Alias "GetPrivateProfileIntA" _ 
    (ByVal lpApplicationName As String, _ 
    ByVal lpKeyName As String, ByVal nDefault As Integer, _ 
    ByVal lpFileName As String) As Integer 
Private Declare Ansi Function FlushPrivateProfileString _ 
    Lib "kernel32.dll" Alias "WritePrivateProfileStringA" _ 
    (ByVal lpApplicationName As Integer, _ 
    ByVal lpKeyName As Integer, ByVal lpString As Integer, _ 
    ByVal lpFileName As String) As Integer 
Dim strFilename As String 

' Constructor, accepting a filename 
Public Sub New(ByVal Filename As String) 
    strFilename = Filename 
End Sub 

' Read-only filename property 
ReadOnly Property FileName() As String 
    Get 
     Return strFilename 
    End Get 
End Property 

Public Function GetString(ByVal Section As String, _ 
    ByVal Key As String, ByVal [Default] As String) As String 
    ' Returns a string from your INI file 
    Dim intCharCount As Integer 
    Dim objResult As New System.Text.StringBuilder(256) 
    intCharCount = GetPrivateProfileString(Section, Key, _ 
     [Default], objResult, objResult.Capacity, strFilename) 
    If intCharCount > 0 Then GetString = _ 
     Left(objResult.ToString, intCharCount) 
End Function 

Public Function GetInteger(ByVal Section As String, _ 
    ByVal Key As String, ByVal [Default] As Integer) As Integer 
    ' Returns an integer from your INI file 
    Return GetPrivateProfileInt(Section, Key, _ 
     [Default], strFilename) 
End Function 

Public Function GetBoolean(ByVal Section As String, _ 
    ByVal Key As String, ByVal [Default] As Boolean) As Boolean 
    ' Returns a boolean from your INI file 
    Return (GetPrivateProfileInt(Section, Key, _ 
     CInt([Default]), strFilename) = 1) 
End Function 

Public Sub WriteString(ByVal Section As String, _ 
    ByVal Key As String, ByVal Value As String) 
    ' Writes a string to your INI file 
    WritePrivateProfileString(Section, Key, Value, strFilename) 
    Flush() 
End Sub 

Public Sub WriteInteger(ByVal Section As String, _ 
    ByVal Key As String, ByVal Value As Integer) 
    ' Writes an integer to your INI file 
    WriteString(Section, Key, CStr(Value)) 
    Flush() 
End Sub 

Public Sub WriteBoolean(ByVal Section As String, _ 
    ByVal Key As String, ByVal Value As Boolean) 
    ' Writes a boolean to your INI file 
    WriteString(Section, Key, CStr(CInt(Value))) 
    Flush() 
End Sub 

Private Sub Flush() 
    ' Stores all the cached changes to your INI file 
    FlushPrivateProfileString(0, 0, 0, strFilename) 
End Sub 
End Class 

我已經用它寫入INI文件。輸出是:

[AF23AE0F] 
Title=Title 
Username=Username 
[4C347E51] 
Title=Title 
Username=Username 

該部分包含一個指定給密鑰的特定ID。例如一旦我輸入「AF23AE0F」作爲部分,它將獲得與「AF23AE0F」部分相關的鍵。由於我有多個部分,我想閱讀每個部分,並在每個部分下獲取密鑰並將它們添加到Listview。

ListView1.Items.Add(New ListViewItem(New String() {ID, Title, Username})) 

以上是我用添加到列表視圖的代碼,這種方法增加了項目每列.. 爲了得到我使用的部分:

Dim objIniFile As New IniFile("C:\data.ini") 
objIniFile.GetString("Get Each Section ID", "Title", "Get Value related to 'Title'") 

通過一個For Each聲明我期望獲取每個部分並閱讀ID並將其添加到上面的方法中,並因此讀取每個鍵。

如何讀取每個部分並獲取密鑰並將它們添加到列表視圖中?

回答

1

好吧,因爲看起來你並沒有被迫使用.ini文件,爲什麼你不用20年的時間向前邁進,並使用XML序列化來讀寫數據到結構化文件?

Module Module1 
    Private Sub WriteUsers(Filename As String) 
     'Create an example user list 
     Dim Users As New List(Of User) 
     Users.Add(New User With {.ID = "JAOIJSFL", .Title = "Hello", .Username = "Guy 1"}) 
     Users.Add(New User With {.ID = "LKGJASOI", .Title = "World", .Username = "Guy 2"}) 

     'Initialize a new XmlSerializer with the type of data you want to write 
     Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(List(Of User))) 
     'Create the file and write the list to it 
     Using fs As New IO.FileStream(Filename, IO.FileMode.Create) 
      Serializer.Serialize(fs, Users) 
     End Using 
    End Sub 

    Private Function ReadUsers(Filename As String) As List(Of User) 
     'Initialize a new XmlSerializer with the type of data you want to read 
     Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(List(Of User))) 
     'Open the input file, read and return the data 
     Using fs As New IO.FileStream(Filename, IO.FileMode.Open) 
      Return CType(Serializer.Deserialize(fs), List(Of User)) 
     End Using 
    End Function 

    Sub Main() 
     'Write data 
     WriteUsers("C:\test\test.xml") 
     'Read the written data back 
     Dim users As List(Of User) = ReadUsers("C:\test\test.xml") 
     'Output the results 
     For Each u As User In users 
      Console.WriteLine(String.Format("ID: {0}, Title: {1}, Name: {2}", u.ID, u.Title, u.Username)) 
     Next 
     Console.ReadKey() 
    End Sub 
End Module 

Public Class User 
    'This class contains all the information about each 'section' that you need 
    Public Property ID As String 
    Public Property Username As String 
    Public Property Title As String 
End Class 

這使用自動生成的XML文檔來編寫包含您的信息到一個文件的自定義類的列表。然後它可以直接從文件中再次將這個列表重新放到一個便利的列表中。它比ini-file有很多優點。