55 CFileMappingT(DWORD multi = 2) : _super(), m_pType(NULL), m_hMapping(NULL), m_nowPage(-1), m_isSeeked(false), m_offset(0)
59 m_pageSize = si.dwAllocationGranularity * multi;
78 virtual bool Lock(DWORD dwTime = INFINITE)
const
106 bool Open(LPCTSTR lpszName = NULL, LONGLONG offset = 0)
112 n = m_tempFileName.
Create();
114 return m_writer.
Open(n,
false,
true);
127 m_tempFileName.
Free();
136 return ToIndex((m_writer.
GetSize() - m_offset) /
sizeof(TYP));
149 if ( m_writer.
Seek(m_IndexToFilePos(size)) < 0 )
165 virtual TYP
Get(INDEX index)
const
180 virtual const TYP&
At(INDEX index)
const
182 const TYP* P = m_Mapping(index);
195 virtual TYP&
Ref(INDEX index)
197 TYP* P = m_Mapping(index);
236 virtual INDEX
Add(
const TYP& t)
239 m_writer.
Write(
sizeof(TYP), &t);
256 loop ( i, (nl - index) - 1 )
278 m_writer.
Seek(m_offset);
290 virtual bool Set(INDEX index,
const TYP& t)
302 LONGLONG m_IndexToFilePos(INDEX index)
const
305 return l *
sizeof(TYP) + m_offset;
308 void m_Unmapping(
void)
310 if ( m_pType != NULL )
312 ::UnmapViewOfFile(m_pType);
316 if ( m_hMapping != NULL )
318 ::CloseHandle(m_hMapping);
328 TYP* m_Mapping(INDEX index)
const
334 if ( m_hMapping == NULL )
336 m_hMapping = ::CreateFileMapping(m_writer, NULL, PAGE_READWRITE, 0, 0, NULL);
337 if ( m_hMapping == NULL )
342 LONGLONG fl = m_IndexToFilePos(index);
343 LONGLONG pl = fl / m_pageSize * m_pageSize;
344 if ( pl != m_nowPage )
346 if ( m_pType != NULL )
348 ::UnmapViewOfFile(m_pType);
352 LONGLONG ns = min(m_pageSize * 2, m_writer.
GetSize() - pl);
353 m_pType =
static_cast<BYTE*
>(::MapViewOfFile(m_hMapping, FILE_MAP_ALL_ACCESS,
static_cast<DWORD
>(pl >> 32),
static_cast<DWORD
>(pl), down_cast<DWORD>(ns)));
354 if ( m_pType == NULL )
356 _GetLastError(
"MapViewOfFile");
357 ::CloseHandle(m_hMapping);
362 return reinterpret_cast<TYP*
>(&m_pType[fl - pl]);
371 mutable HANDLE m_hMapping;
372 mutable BYTE* m_pType;
373 mutable LONGLONG m_nowPage;
#define loop(VAR, CNT)
loop構文.
virtual size_t GetSize(void) const
[取得] 要素数取得.
virtual TYP Get(INDEX index) const
[取得] 要素の取得.
CFileMappingT(DWORD multi=2)
コンストラクタ.
virtual bool Remove(INDEX index)
[削除] 要素一つ削除.
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
bool Open(LPCTSTR lpszName=NULL, LONGLONG offset=0)
[操作] オープン.
~CFileMappingT(void)
デストラクタ.
virtual bool SetSize(size_t size)
[設定] 要素数設定.
const TYP & operator[](INDEX index) const
[取得] 要素の取得.
virtual TYP & Ref(INDEX index)
[取得] 要素の参照取得.
virtual bool RemoveAll(void)
[削除] 全要素削除 .
bool IsOpened(void) const
[確認] オープン確認.
void Close(void)
[操作] クローズ.
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
TYP & operator[](INDEX index)
[取得] 要素の参照取得.
virtual void Unlock(void) const
[排他] アンロック
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boIsBottom=true)
[操作] オープン.
virtual LONGLONG GetSize(void) const
[取得] ファイルサイズ取得
virtual void Close(void)
[操作] クローズ
virtual void Write(size_t size, LPCVOID P)
[保存] ファイル書き込み
virtual void SetEnd(void)
[設定] EOFを指定.
virtual bool CanWrite(void) const
[確認] 書込み可能か
bool IsEmpty(void) const
[確認] 空チェック
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
virtual void Unlock(void) const
[排他] アンロック
CStr Create(void)
[操作] 作成.
CFileMappingT< BYTE > CFileMapping
ファイルマッピングクラス
bool IsInRange(INDEX index) const
[確認] INDEXの有効確認.