TNB Library
TnbArchiveFileFinder.h
[詳解]
1#pragma once
12#include "TnbFileFinder.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
54{
55 DEFSUPER(CAbstractFileFinder);
56 CArchiverDllHandler* m_pDll;
57 CAscii m_strArcFile;
58 DWORD m_dwMode;
59 HARC m_hArc;
60 TIndividualInfo m_foundInfo;
61
76 static DWORD ms_ArcAttrToWin32Attr(int aa)
77 {
78 DWORD r = 0;
79 if ( (aa & FA_RDONLY) != 0 ) { r |= FILE_ATTRIBUTE_READONLY; }
80 if ( (aa & FA_HIDDEN) != 0 ) { r |= FILE_ATTRIBUTE_HIDDEN; }
81 if ( (aa & FA_SYSTEM) != 0 ) { r |= FILE_ATTRIBUTE_SYSTEM; }
82 if ( (aa & FA_LABEL) != 0 ) { r |= FILE_ATTRIBUTE_TEMPORARY; }
83 if ( (aa & FA_DIREC) != 0 ) { r |= FILE_ATTRIBUTE_DIRECTORY; }
84 if ( (aa & FA_ARCH) != 0 ) { r |= FILE_ATTRIBUTE_ARCHIVE; }
85 if ( (aa & FA_ENCRYPTED) != 0 ) { r |= FILE_ATTRIBUTE_ENCRYPTED; }
86 if ( r == 0 ) { r |= FILE_ATTRIBUTE_NORMAL; }
87 return r;
88 }
89
97 bool m_MakeWin32Info(WIN32_FIND_DATA& _win32Info)
98 {
99 Zero(_win32Info);
100 try
101 {
102 //-- 属性変換
103 int arcAttr = 0;
104 m_pDll->Func(arcAttr, "GetAttribute", m_hArc);
105 _win32Info.dwFileAttributes = ms_ArcAttrToWin32Attr(arcAttr);
106 //-- 書込時間
107 BOOL r;
108 if ( m_pDll->QueryFunctionList(ISARC_GET_WRITE_TIME_EX) )
109 {
110 m_pDll->Func(r, "GetWriteTimeEx", m_hArc, &(_win32Info.ftLastWriteTime));
111 }
112 else
113 {
114 //_win32Info.ftLastWriteTime
115 //m_foundInfo.wDate , m_foundInfo.wTime;
116 }
117 _win32Info.ftCreationTime = _win32Info.ftLastWriteTime;
118 _win32Info.ftLastAccessTime = _win32Info.ftLastWriteTime;
119 if ( m_pDll->QueryFunctionList(ISARC_GET_CREATE_TIME_EX) )
120 {
121 m_pDll->Func(r, "GetCreateTimeEx", m_hArc, &(_win32Info.ftCreationTime));
122 }
123 if ( m_pDll->QueryFunctionList(ISARC_GET_ACCESS_TIME_EX) )
124 {
125 m_pDll->Func(r, "GetAccessTimeEx", m_hArc, &(_win32Info.ftLastAccessTime));
126 }
127 //-- サイズ
128 _win32Info.nFileSizeHigh = 0;
129 _win32Info.nFileSizeLow = m_foundInfo.dwOriginalSize;
130 //-- 予備
131 _win32Info.dwReserved0 = 0;
132 _win32Info.dwReserved1 = 0;
133 //-- 名前
134 CStr s = m_foundInfo.szFileName;
135 STRLIB::Copy(_win32Info.cFileName, s.Left(MAX_PATH));
136 _win32Info.cAlternateFileName[0] = 0;
137 return true;
138 }
139 catch(CNullPointerException& e)
140 {
141 e.OnCatch();
142 }
143 catch(...)
144 {
145 ASSERTLIB(false);
146 throw;
147 }
148 return false;
149 }
150
151public:
152
154 CArchiveFileFinder(void) : _super(), m_pDll(NULL), m_hArc(NULL), m_dwMode(0)
155 {
156 }
157
160 {
161 OnFinish();
162 }
163
174 bool Initialize(CArchiverDllHandler* pDll, LPCTSTR lpszArcFileName, DWORD dwMode = 0)
175 {
176 Finish();
177 if ( pDll == NULL )
178 {
179 ASSERT0( false, "CArchiveFileFinder()", "正しいアーカイバ管理クラスが指定されていません。" );
180 return false;
181 }
182 if ( ! pDll->IsReady() )
183 {
184 ASSERT0( false, "CArchiveFileFinder()", "使用可能なアーカイバ管理クラスが指定されていません。" );
185 return false;
186 }
187 int r = static_cast<int>(::GetFileAttributes(lpszArcFileName));
188 if ( r < 0 )
189 {
190 _GetLastError("GetFileAttributes");
191 return false;
192 }
193 m_pDll = pDll;
194 m_strArcFile = lpszArcFileName;
195 m_dwMode = dwMode;
196 return true;
197 }
198
205 const TIndividualInfo* RefPtr(void) const
206 {
207 if ( m_hArc != NULL )
208 {
209 return &m_foundInfo;
210 }
211 return NULL;
212 }
213
220 {
221 return m_strArcFile;
222 }
223
230 {
231 return m_pDll;
232 }
233
234protected:
235
243 virtual bool OnStart(WIN32_FIND_DATA& _data, LPCTSTR lpszName)
244 {
245 if ( m_pDll != NULL )
246 {
247 Finish();
248 m_hArc = m_pDll->OpenArchive(m_strArcFile, m_dwMode);
249 if ( m_hArc != NULL )
250 {
251 int r;
252 m_pDll->Func(r, "FindFirst", m_hArc, lpszName, &m_foundInfo);
253 if ( r == 0 )
254 {
255 return m_MakeWin32Info(_data);
256 }
257 }
258 }
259 return false;
260 }
261
270 virtual bool OnNext(WIN32_FIND_DATA& _data)
271 {
272 if ( m_pDll != NULL && m_hArc != NULL )
273 {
274 int r;
275 m_pDll->Func(r, "FindNext", m_hArc, &m_foundInfo);
276 if ( r == 0 )
277 {
278 return m_MakeWin32Info(_data);
279 }
280 }
281 return false;
282 }
283
288 virtual void OnFinish(void)
289 {
290 if ( m_pDll != NULL && m_hArc != NULL )
291 {
292 m_pDll->CloseArchive(m_hArc);
293 m_hArc = NULL;
294 }
295 }
296};
297
298
299
300}; // TNB
アーカイバDLL関係のヘッダ
ファイル検索関係のヘッダ
ファイル検索抽象クラス
Definition: TnbFileFinder.h:33
void Finish(void)
[設定] 検索終了.
アーカイブ内ファイル検索クラス
virtual ~CArchiveFileFinder(void)
デストラクタ
bool Initialize(CArchiverDllHandler *pDll, LPCTSTR lpszArcFileName, DWORD dwMode=0)
[設定] 初期化
CAscii GetTargetArchiveFileName(void) const
[取得] 使用アーカイブファイル名、取得
CArchiverDllHandler * GetDllHandler(void) const
[取得] 使用アーカイバDLL管理クラス、参照
CArchiveFileFinder(void)
コンストラクタ
const TIndividualInfo * RefPtr(void) const
[取得] 検索情報参照
virtual void OnFinish(void)
[通知] 検索終了通知
virtual bool OnStart(WIN32_FIND_DATA &_data, LPCTSTR lpszName)
[通知] 検索開始通知
virtual bool OnNext(WIN32_FIND_DATA &_data)
[通知] 次検索通知
アーカイバDLL管理クラス
int CloseArchive(HARC hArc)
[処理] アーカイブClose.
bool IsReady(void) const
[確認] DLL準備確認
bool QueryFunctionList(const int iFunction)
[確認] ファンクションチェック.
R Func(R &_r, LPCSTR lpszFuncName)
[実行] DLL関数実行
HARC OpenArchive(LPCSTR lpszArcFile, const DWORD dwMode=0)
[処理] アーカイブOpen.
NULLポインタ例外
Definition: TnbException.h:172
CStrT Left(size_t iSize) const
[作成] 範囲取得.
Definition: TnbStr.h:801
void OnCatch(void) const
[表示] 内容表示
Definition: TnbException.h:69
void Copy(LPSTR _dst, LPCSTR src)
[複製] 文字列コピー(ASCII/SJIS用)
Definition: TnbStrLib.h:89
void Zero(V &value)
[設定] ゼロクリア.
Definition: TnbDef.h:399
TNB Library
Definition: TnbDoxyTitle.txt:2
アーカイバDLL用情報構造体
char szFileName[FNAME_MAX32+1]
格納ファイル名
DWORD dwOriginalSize
ファイルのサイズ