■89072 / inTopicNo.13) |
Re[5]: GetPrivateProfileSectionについて |
□投稿者/ 魔界の仮面弁士 (1901回)-(2018/10/30(Tue) 11:11:54)
|
■No89067 (UMS さん) に返信 > 頂いたサンプルやご説明を基にmsdnなどと照らし合わせGetPrivateProfileSectionの理解を深めることができたと思います。 > 特に<In>属性の箇所など全く考慮しておらず、大変勉強になりました。有難うございます。
参考までに:
KEN's .NET - [特集6] GetPrivateProfileStringにみるAPIの使用方法 http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html http://www5b.biglobe.ne.jp/~yone-ken/VBNET/Reference/ref2_GetPrivateProfileString.html
> GetPrivateProfileString(指定セクション, vbNullString, "", strBuffer, strBuffer.Capacity, FileName)
774RR さんも書かれていますが、今回のケースでは StringBuilder は使えません。
> キー値にNothing指定をすればセクションに紐づくキー値を全て取得できるそうなので セクションとキーを指定すれば、値が得られます。 バッファが足りない場合の戻り値は nSize - 1 です。
セクションを指定して、キーを Nothing にすれば、キーの一覧が vbNullChar 区切りで得られます。 バッファが足りない場合の戻り値は nSize - 2 です。
セクションとキーを Nothing にすれば、セクションの一覧が vbNullChar 区切りで得られます。 バッファが足りない場合の戻り値は nSize - 2 です。
手元の環境では、 Dim ini As String = "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini" に サイズ 1.44MB の巨大な ini ファイル(4250 エントリ)があったので、 処理効率を無視して、全項目を GetPrivateProfileString で列挙させてみたところ、 4.5 秒もの時間が必要でした。
一括取得が目的の場合、サイズによっては、 System.IO.File.ReadLines で自力解析した方が早いかも知れません。
Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" ( <MarshalAs(UnmanagedType.LPWStr)> ByVal lpAppName As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpKeyName As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpDefault As String, <MarshalAs(UnmanagedType.LPWStr, SizeParamIndex:=4)> ByVal lpReturnedString As String, ByVal nSize As Integer, <MarshalAs(UnmanagedType.LPWStr)> ByVal lpFileName As String) As Integer
Public Function GetAllIniSettings(ByVal lpFileName As String) As Dictionary(Of String, Dictionary(Of String, String)) Const DefaultBufferSize As Integer = 4096 'Const DefaultBufferSize As Integer = 256 * 1024
Dim sections As Dictionary(Of String, Dictionary(Of String, String)) Dim secSize As Integer = DefaultBufferSize Do Dim secBuf As New String(ChrW(0), secSize) Dim secLen As Integer = GetPrivateProfileString(Nothing, Nothing, Nothing, secBuf, secSize, lpFileName) If secLen = secSize - 2 Then secSize += DefaultBufferSize Else sections = secBuf.Substring(0, secLen).Split(vbNullChar.ToArray(), StringSplitOptions.RemoveEmptyEntries).ToDictionary(Function(k) k, Function() New Dictionary(Of String, String)) Exit Do End If Loop
For Each section In sections Dim keySize As Integer = DefaultBufferSize Do Dim keyBuf As New String(ChrW(0), keySize) Dim keyLen As Integer = GetPrivateProfileString(section.Key, Nothing, Nothing, keyBuf, keySize, lpFileName) If keyLen = keySize - 2 Then keySize += DefaultBufferSize Else For Each key In keyBuf.Substring(0, keyLen).Split(vbNullChar.ToArray(), StringSplitOptions.RemoveEmptyEntries) Dim valSize As Integer = DefaultBufferSize While True Dim valBuf As New String(ChrW(0), valSize) Dim valLen As Integer = GetPrivateProfileString(section.Key, key, Nothing, valBuf, valSize, lpFileName) If valLen = valSize - 1 Then valSize += DefaultBufferSize Else section.Value.Add(key, valBuf.Substring(0, valLen)) Exit While End If End While Next Exit Do End If Loop Next
Return sections End Function
|
|