TNB Library
TnbInifileAccessor.h
[詳解]
1#pragma once
11#ifndef _WIN32_WCE
12
13#include "TnbAccessor.h"
14#include "TnbDntStr.h"
15
16
17
18//TNB Library
19namespace TNB
20{
21
22
23
58{
59 DEFSUPER(CAbstractAccessor);
60public:
61
66 explicit CInifileAccessor(LPCTSTR lpszFile = NULL) : _super()
67 {
69 }
70
75 void SetBase(LPCTSTR lpszFile = NULL)
76 {
77 m_strFile = (lpszFile == NULL) ? MakeInifilePath() : lpszFile;
78 }
79
85 static CStr MakeInifilePath(void)
86 {
87 CStr str = _super::MakeDefineFilePath();
88 str += _T(".ini");
89 return str;
90 }
91
97 {
98 return m_strFile;
99 }
100
108 bool ExistBaseFile(void) const
109 {
110 DWORD r = ::GetFileAttributes(m_strFile);
111 return ToInt(r) >= 0;
112 }
113
129 bool NewBaseFile(bool isUnicode = false)
130 {
131 bool r = false;
132 HANDLE h = ::CreateFile(m_strFile, GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL);
133 // 書込み
134 if ( h != INVALID_HANDLE_VALUE )
135 {
136 if ( isUnicode )
137 {
138 BYTE buf[2] = { 0xFF, 0xFE };
139 DWORD writed;
140 if ( ::WriteFile(h, buf, 2, &writed, NULL) && 2 == writed )
141 {
142 r = true;
143 }
144 }
145 else
146 {
147 r = true;
148 }
149 ::CloseHandle(h);
150 }
151 return r;
152 }
153
158 virtual CStr GetTypeName(void) const
159 {
160 return _T("Inifile");
161 }
162
168 virtual bool Flush(void)
169 {
170 ::WritePrivateProfileString(NULL, NULL, NULL, m_strFile); //戻り値は必ずfalse(仕様)なので見ない
171 return true;
172 }
173
179 virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName = NULL) const
180 {
181 CStrVector vs;
183 DWORD dwRc = ::GetPrivateProfileSectionNames(
184 dntstr.GetBuffer(E_BufferSize),
185 E_BufferSize,
186 m_strFile);
187 dntstr.ReleaseBuffer();
188 if ( dwRc <= 0 )
189 {
190 return vs;
191 }
192 vs = dntstr.ToStrVector();
193 CStr ss = lpszSectionName;
194 size_t len = ss.GetLength();
195 if ( ! ss.IsEmpty() )
196 {
197 loop ( i, vs.GetSize() )
198 {
199 CStr s;
200 if ( STRLIB::Compare(vs[i], ss, len, NORM_IGNORECASE) == 0 )
201 {
202 s = vs[i].Mid(len);
203 if ( ! s.IsEmpty() && s[0] == '\\' )
204 {
205 s = s.Mid(1);
206 }
207 else
208 {
209 s.Empty();
210 }
211 }
212 vs[i] = s;
213 }
214 }
215 CStrVector vstrSecNames;
216 loop ( i, vs.GetSize() )
217 {
218 if ( ! vs[i].IsEmpty() )
219 {
220 CStr s = vs[i];
221 INDEX d = s.Find(_T('\\'));
222 if ( d != INVALID_INDEX )
223 {
224 s = s.Left(d);
225 }
226 if ( vstrSecNames.Find(s) == INVALID_INDEX )
227 {
228 vstrSecNames.Add(s);
229 }
230 }
231 }
232 return vstrSecNames;
233 }
234
241 virtual bool DeleteSection(LPCTSTR lpszSectionName)
242 {
243 CStrVector vs;
245 DWORD dwRc = ::GetPrivateProfileSectionNames(
246 dntstr.GetBuffer(E_BufferSize),
247 E_BufferSize,
248 m_strFile);
249 dntstr.ReleaseBuffer();
250 if ( dwRc <= 0 )
251 {
252 return false;
253 }
254 vs = dntstr.ToStrVector();
255 CStr ss = lpszSectionName;
256 size_t len = ss.GetLength();
257 loop ( i, vs.GetSize() )
258 {
259 if ( STRLIB::Compare(vs[i], ss, len, NORM_IGNORECASE) == 0 )
260 {
261 if ( ! ::WritePrivateProfileString(vs[i], NULL, NULL, m_strFile) )
262 {
263 return false;
264 }
265 }
266 }
267 return true;
268 }
269
275 virtual CStrVector EnumKeyNames(LPCTSTR lpszSectionName) const
276 {
277 CStrVector vstrKeyNames;
279 DWORD dwRc = ::GetPrivateProfileSection(
280 lpszSectionName,
281 dntstr.GetBuffer(E_BufferSize),
282 E_BufferSize,
283 m_strFile);
284 dntstr.ReleaseBuffer();
285 if ( dwRc > 0 )
286 {
287 CStrVector vstr = dntstr.ToStrVector();
288 loop ( i, vstr.GetSize() )
289 {
290 vstrKeyNames.Add(vstr[i].FindCut('='));
291 }
292 }
293 return vstrKeyNames;
294 }
295
303 virtual EKind GetKeyKind(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
304 {
305 CStr dmy;
306 if ( ! m_QueryString(dmy, lpszSectionName, lpszKey) )
307 {
308 return EK_Nothing;
309 }
310 return EK_String;
311 }
312
319 virtual CValue QueryValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
320 {
321 CStr s;
322 if ( m_QueryString(s, lpszSectionName, lpszKey) )
323 {
324 return CValue(s);
325 }
326 return CValue();
327 }
328
338 virtual bool WriteValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey, const IAccessor::CValue& value)
339 {
340 if ( value.GetKind() == EK_Nothing )
341 {
342 return m_Delete(lpszSectionName, lpszKey);
343 }
344 return m_WriteString(lpszSectionName, lpszKey, value.QueryString());
345 }
346
347private:
348 enum { E_BufferSize = 65536 };
349
357 CStr m_GetString(LPCTSTR lpszSectionName, LPCTSTR lpszKey, LPCTSTR lpszDefault) const
358 {
359 ASSERT( lpszDefault != NULL );
360 CStr strValue;
361 ::GetPrivateProfileString(
362 lpszSectionName,
363 lpszKey,
364 lpszDefault,
365 strValue.GetBuffer(E_BufferSize),
366 E_BufferSize,
367 m_strFile);
368 strValue.ReleaseBuffer();
369 return strValue;
370 }
371
380 bool m_QueryString(CStr& _r, LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
381 {
382 _r = m_GetString(lpszSectionName, lpszKey, _T("*1"));
383 if ( _r.Compare(_T("*1")) == 0 )
384 {
385 _r = m_GetString(lpszSectionName, lpszKey, _T("*2"));
386 if ( _r.Compare(_T("*2")) == 0 )
387 {
388 return false;
389 }
390 }
391 return true;
392 }
393
402 bool m_WriteString(LPCTSTR lpszSectionName, LPCTSTR lpszKey, LPCTSTR lpszData)
403 {
404 DWORD len = down_cast<DWORD>(STRLIB::GetLen(lpszData));
405 CWorkMemT<TCHAR> work(len + 2);
406 DWORD r = ::GetPrivateProfileString(lpszSectionName, lpszKey, _T(""), work, len + 2, m_strFile);
407 if ( r == len && STRLIB::Compare(lpszData, work) == 0 )
408 {
409 return true;
410 }
411 return !! ::WritePrivateProfileString(lpszSectionName, lpszKey, lpszData, m_strFile);
412 }
413
421 bool m_Delete(LPCTSTR lpszSectionName, LPCTSTR lpszKey)
422 {
423 if ( GetKeyKind(lpszSectionName, lpszKey) != EK_Nothing )
424 {
425 return !! ::WritePrivateProfileString(lpszSectionName, lpszKey, NULL, m_strFile);
426 }
427 return false;
428 }
429
430 CStr m_strFile;
431 CStr m_strSection;
432};
433
434
435
436}; // TNB
437
438#else // _WIN32_WCE
439
440#include "TnbCeInifileAccessor.h"
441
442#endif // _WIN32_WCE
443
情報アクセス関係のヘッダ
CE専用 INI ファイル情報アクセス関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
Double Null Terminate(DNT)型文字列操作関係のヘッダ
情報アクセス抽象クラス.
Definition: TnbAccessor.h:967
Double Null Terminate(DNT)型文字列管理
Definition: TnbDntStr.h:61
LPTSTR GetBuffer(int iLength)
[操作] 書き込みバッファ要求.
Definition: TnbDntStr.h:267
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbDntStr.h:277
CStrVector ToStrVector(void) const
[取得] 文字列配列取得.
Definition: TnbDntStr.h:223
iniファイルアクセスクラス
CInifileAccessor(LPCTSTR lpszFile=NULL)
コンストラクタ
virtual CStr GetTypeName(void) const
[取得] タイプ名取得
virtual bool Flush(void)
[操作] フラッシュ.
CStr GetBaseFileName(void) const
[取得] 対象ファイル取得
virtual CStrVector EnumKeyNames(LPCTSTR lpszSectionName) const
[取得] 名前一覧取得
virtual bool WriteValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey, const IAccessor::CValue &value)
[設定] 情報設定
virtual bool DeleteSection(LPCTSTR lpszSectionName)
[削除] 指定セクション削除
virtual CValue QueryValue(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
[取得] 情報取得
bool NewBaseFile(bool isUnicode=false)
[作成] 対象ファイル作成.
virtual EKind GetKeyKind(LPCTSTR lpszSectionName, LPCTSTR lpszKey) const
[取得] 情報取種取得
void SetBase(LPCTSTR lpszFile=NULL)
[設定] 対象ファイル指定
bool ExistBaseFile(void) const
[確認] 対象ファイル存在確認.
static CStr MakeInifilePath(void)
[作成] iniファイルパス作成.
virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName=NULL) const
[取得] セクション名一覧取得
int Compare(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:658
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
Definition: TnbStr.h:540
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
Definition: TnbStr.h:766
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
CVectorT< TYP > Mid(INDEX startIndex, size_t size=0) const
[作成] 切り出し
Definition: TnbVector.h:705
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
情報アクセスの汎用値保持クラス.
Definition: TnbAccessor.h:100
CStr QueryString(void) const
[取得] 文字列情報取得
Definition: TnbAccessor.h:185
EKind GetKind(void) const
[取得] 情報取種取得
Definition: TnbAccessor.h:171
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
Definition: TnbStrLib.h:135
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
Definition: TnbStrLib.h:44
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2
EKind
値型の種類.
Definition: TnbAccessor.h:80
@ EK_String
文字列
Definition: TnbAccessor.h:82
@ EK_Nothing
存在しない
Definition: TnbAccessor.h:81
INDEX Find(const IChecker &checker, INDEX startIndex=0, bool boIsReverse=false) const
[検索] 条件一致要素の検索.