TNB Library
TnbTemporaryFile.h
[詳解]
1#pragma once
11#include "TnbStr.h"
12#include "TnbVector.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
41template<DWORD PFIX>
43{
44 CStr m_tempFolder;
45 CStr m_targetFile;
46 bool m_Create(void)
47 {
48 Free();
49 CStr strPath;
50 if ( m_tempFolder.IsEmpty() )
51 {
52 ::GetTempPath(MAX_PATH, strPath.GetBuffer(MAX_PATH));
53 strPath.ReleaseBuffer();
54 }
55 else
56 {
57 strPath = m_tempFolder;
58 }
59 const static TCHAR tc[5] = { (PFIX&0xFF), ((PFIX>>8)&0xFF), ((PFIX>>16)&0xFF), ((PFIX>>24)&0xFF), 0 };
60 ::GetTempFileName(strPath, tc, 0, m_targetFile.GetBuffer(MAX_PATH));
61 m_targetFile.ReleaseBuffer();
62 return ! m_targetFile.IsEmpty();
63 }
64
65public:
66
69 {
70 }
71
78 {
79 if ( ! m_targetFile.IsEmpty() )
80 {
81 ::DeleteFile(m_targetFile);
82 m_targetFile.Empty();
83 }
84 }
85
90 CStr GetName(void) const
91 {
92 return m_targetFile;
93 }
94
100 bool HasThat(void) const
101 {
102 return ! m_targetFile.IsEmpty();
103 }
104
111 void Free(void)
112 {
113 if ( ! m_targetFile.IsEmpty() )
114 {
115 if ( ! ::DeleteFile(m_targetFile) )
116 {
117 throw CDeleteFailureException(_GetLastError("DeleteFile"));
118 }
119 m_targetFile.Empty();
120 }
121 }
122
128 void Detach(void)
129 {
130 m_targetFile.Empty();
131 }
132
142 {
143 CByteVector vb;
144 if ( ! m_targetFile.IsEmpty() )
145 {
146 HANDLE h = ::CreateFile(m_targetFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
147 if ( h == INVALID_HANDLE_VALUE )
148 {
149 throw COpenFailureException(_GetLastError("CreateFile"));
150 }
151 DWORD dw = 0;
152 DWORD size = ::GetFileSize(h, &dw);
153 if ( size > 0 )
154 {
155 vb.SetSize(size);
156 BOOL boRc = ::ReadFile(h, vb.GetBuffer(size), size, &dw, NULL);
157 if ( ! boRc || dw != size )
158 {
159 throw CReadFailureException(_GetLastError("ReadFile"));
160 }
161 vb.ReleaseBuffer();
162 }
163 ::CloseHandle(h);
164 Free();
165 }
166 return vb;
167 }
168
177 {
178 m_Create();
179 return m_targetFile;
180 }
181
190 CStr Create(size_t size)
191 {
192 if ( m_Create() && size > 0 )
193 {
194 HANDLE h = ::CreateFile(m_targetFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
195 if ( h == INVALID_HANDLE_VALUE )
196 {
197 throw COpenFailureException(_GetLastError("CreateFile"));
198 }
199 LONG l = 0;
200 ::SetFilePointer(h, ToDword(size), &l, FILE_BEGIN);
201 VERIFY( ::SetEndOfFile(h) );
202 ::CloseHandle(h);
203 }
204 return m_targetFile;
205 }
206
216 CStr Create(size_t size, LPCVOID P)
217 {
218 if ( m_Create() && size >= 0 )
219 {
220 HANDLE h = ::CreateFile(m_targetFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
221 if ( h == INVALID_HANDLE_VALUE )
222 {
223 throw COpenFailureException(_GetLastError("CreateFile"));
224 }
225 DWORD dw = 0;
226 VERIFY( ::WriteFile(h, P, ToDword(size), &dw, NULL) );
227 ::CloseHandle(h);
228 }
229 return m_targetFile;
230 }
231
241 {
242 return Create(vb.GetSize(), vb.ReferBuffer());
243 }
244
250 void SetTempraryFolder(LPCTSTR pFolder)
251 {
252 m_tempFolder = pFolder;
253 }
254
263 CStr Attach(LPCSTR lpszFile)
264 {
265 if ( ToInt(::GetFileAttributes(lpszFile)) == -1 )
266 {
267 throw COpenFailureException(_GetLastError("GetFileAttributes"));
268 }
269 m_targetFile = lpszFile;
270 return m_targetFile;
271 }
272};
273
274
275
287
288
289
290}; // TNB
文字列管理関係のヘッダ
配列型情報管理関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
削除失敗発生例外
Definition: TnbException.h:269
オープン失敗発生例外
Definition: TnbException.h:227
読み込み失敗発生例外
Definition: TnbException.h:241
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
void Empty(void)
[削除] 空化
Definition: TnbStr.h:197
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
テンポラリファイル管理テンプレートクラス
CStr Create(size_t size)
[操作] 作成.
bool HasThat(void) const
[確認] テンポラリファイル有無確認
void SetTempraryFolder(LPCTSTR pFolder)
[設定] テンポラリフォルダ指定.
CTemporaryFileT(void)
コンストラクタ
CByteVector Release(void)
[操作] 解放.
CStr Create(size_t size, LPCVOID P)
[操作] 作成.
void Detach(void)
[操作] 解放.
CStr GetName(void) const
[取得] テンポラリファイル名取得
CStr Create(void)
[操作] 作成.
CStr Attach(LPCSTR lpszFile)
[操作] アタッチ.
CStr Create(const ISequenceCollectionT< BYTE > &vb)
[操作] 作成.
~CTemporaryFileT(void)
デストラクタ.
void Free(void)
[操作] 解放.
TYP * GetBuffer(size_t size=0)
[操作] データアドレス取得
Definition: TnbVector.h:745
void ReleaseBuffer(void)
[操作] データの管理を元に戻す.
Definition: TnbVector.h:805
virtual bool SetSize(size_t size)
[操作] サイズ指定
Definition: TnbVector.h:618
CTemporaryFileT< 'bnt'> CTemporaryFile
テンポラリファイル管理テンプレート
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:395
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:367
TNB Library
Definition: TnbDoxyTitle.txt:2
virtual const TYP * ReferBuffer(void) const =0
[取得] データアドレス取得.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.