TNB Library
TnbMappedFileReader.h
[詳解]
1#pragma once
11#include "TnbReader.h"
12
13
14
15//TNB Library
16namespace TNB
17{
18
19
20
32{
33public:
34
36 CMappedFileReader(void) : m_readPos(0), m_fileSize(0), m_pView(NULL), m_hFile(INVALID_HANDLE_VALUE), m_hMapping(NULL)
37 {
38 }
39
42 {
43 Close();
44 }
45
53 bool Open(LPCTSTR fileName)
54 {
55 Close();
56 m_hFile = ::CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
57 if ( m_hFile != INVALID_HANDLE_VALUE )
58 {
59 m_fileSize = ::GetFileSize(m_hFile, NULL);
60 m_hMapping = ::CreateFileMapping(m_hFile, NULL, PAGE_READONLY, 0, 0, NULL);
61 if ( m_hMapping != NULL )
62 {
63 m_pView = static_cast<const BYTE*>(::MapViewOfFile(m_hMapping, FILE_MAP_READ, 0, 0, 0));
64 if ( m_pView != NULL )
65 {
66 m_fileName = fileName;
67 return true;
68 }
69 }
70 }
71 Close();
72 return false;
73 }
74
79 virtual LPCTSTR GetOpenName(void) const
80 {
81 return m_fileName;
82 }
83
87 virtual void Close(void)
88 {
89 if ( m_pView != NULL )
90 {
91 ::UnmapViewOfFile(m_pView);
92 m_pView = NULL;
93 }
94 if ( m_hMapping != NULL )
95 {
96 ::CloseHandle(m_hMapping);
97 m_hMapping = NULL;
98 }
99 if ( m_hFile != INVALID_HANDLE_VALUE)
100 {
101 ::CloseHandle(m_hFile);
102 m_hFile = INVALID_HANDLE_VALUE;
103 }
104 m_readPos = 0;
105 m_fileSize = 0;
106 m_fileName.Empty();
107 }
108
114 virtual bool CanRead(void) const
115 {
116 return m_pView != NULL;
117 }
118
124 virtual LONGLONG GetSize(void) const
125 {
126 return m_fileSize;
127 }
128
137 virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
138 {
139 LONGLONG l = m_fileSize;
140 LONGLONG p = llOffset;
141 switch ( eSeek )
142 {
143 case END:
144 p += l;
145 break;
146 case CURRENT:
147 p += m_readPos;
148 break;
149 }
150 if ( p < 0 )
151 {
152 return -1;
153 }
154 else if ( p > l )
155 {
156 p = l;
157 }
158 m_readPos = static_cast<INDEX>(p);
159 return p;
160 }
161
169 virtual size_t Read(size_t size, LPVOID _P) const
170 {
171 size_t s = size;
172 size_t l = m_fileSize - m_readPos;
173 if ( s > l )
174 {
175 s = l;
176 }
177 MemCopy(static_cast<BYTE*>(_P), &m_pView[m_readPos], s);
178 m_readPos += s;
179 return s;
180 }
181
187 const BYTE* Refer(void) const
188 {
189 return m_pView;
190 }
191
198 BYTE operator[](INDEX index) const
199 {
200 if ( index < m_fileSize )
201 {
202 return m_pView[index];
203 }
204 return NULL;
205 }
206
207private:
208 const BYTE* m_pView;
209 HANDLE m_hFile;
210 HANDLE m_hMapping;
211 size_t m_fileSize;
212 CSimpleStr m_fileName;
213 mutable INDEX m_readPos;
214};
215
216
217
218}; //TNB
ファイル関係のヘッダ
マップドファイルリーダークラス
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
CMappedFileReader(void)
コンストラクタ
virtual size_t Read(size_t size, LPVOID _P) const
[取得] 読み込み
const BYTE * Refer(void) const
[参照] データアドレス参照.
BYTE operator[](INDEX index) const
[取得] データ取得.
virtual LONGLONG GetSize(void) const
[取得] サイズ取得
virtual bool CanRead(void) const
[確認] 読み込み可能か
virtual LPCTSTR GetOpenName(void) const
[取得] オープン名取得
~CMappedFileReader(void)
デストラクタ
virtual void Close(void)
[操作] クローズ
bool Open(LPCTSTR fileName)
[操作] オープン
簡易文字列管理クラス.
Definition: TnbDef.h:772
void Empty(void)
[操作] 空化
Definition: TnbDef.h:835
TNB Library
Definition: TnbDoxyTitle.txt:2
void MemCopy(T *_pDst, const void *pSrc, size_t len)
[複製] メモリコピー
Definition: TnbDef.h:376
読み込みインターフェース
Definition: TnbReader.h:36
ESeekMode
シークのオフセット指定モード
Definition: TnbReader.h:39
@ TOP
頭からのオフセット指定
Definition: TnbReader.h:40
@ CURRENT
現在位置からのオフセット指定
Definition: TnbReader.h:41
@ END
末からのオフセット指定
Definition: TnbReader.h:42