TNB Library
TnbFile.h
[詳解]
1#pragma once
14#include "TnbWriter.h"
15#include "TnbTime.h"
16#include "TnbHandleHandle.h"
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
36{
37public:
39 enum EMode
40 {
45 };
46
48 CAbstractFile(void) : m_boCanWrite(false), m_attributes(0)
49 {
50 }
51
53 virtual ~CAbstractFile(void)
54 {
55 Close();
56 }
57
63 void Close(void)
64 {
65 SetHandle(INVALID_HANDLE_VALUE);
66 }
67
73 void SetCreatedAttributes(DWORD attr)
74 {
75 m_attributes = attr;
76 }
77
88 bool OpenOnMode(LPCTSTR lpszName, EMode eMode = ACCESS, bool isShare = true)
89 {
90 Close();
91 m_strName = lpszName;
92 m_boCanWrite = true;
93 DWORD dwDesiredAccess;
94 DWORD dwShareMode;
95 DWORD dwCreationDisposition;
96 switch ( eMode )
97 {
98 default:
99 case READ: // 読み込みオープン(既存でなければエラーになります)
100 dwDesiredAccess = GENERIC_READ;
101 dwCreationDisposition = OPEN_EXISTING;
102 dwShareMode = isShare ? (FILE_SHARE_READ) : 0;
103 m_boCanWrite = false;
104 break;
105 case WRITE: // 書き込みオープン(既存でなければ作成されます)
106 dwDesiredAccess = GENERIC_WRITE;
107 dwCreationDisposition = OPEN_ALWAYS;
108 dwShareMode = isShare ? (FILE_SHARE_WRITE) : 0;
109 break;
110 case ACCESS: // 読み書きオープン(既存でなければ作成されます)
111 dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
112 dwCreationDisposition = OPEN_ALWAYS;
113 dwShareMode = isShare ? (FILE_SHARE_READ | FILE_SHARE_WRITE) : 0;
114 break;
115 case CREATE: // 新規書き込みオープン(既存ファイルは消されます)
116 dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
117 dwCreationDisposition = CREATE_ALWAYS;
118 dwShareMode = isShare ? (FILE_SHARE_READ | FILE_SHARE_WRITE) : 0;
119 break;
120 }
121 SetHandle(ApiCreateFile(lpszName, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, m_attributes, NULL));
122 if ( GetHandle() != INVALID_HANDLE_VALUE )
123 {
124 return true;
125 }
126 return false;
127 }
128
134 bool CanRead(void) const
135 {
136 return GetHandle() != INVALID_HANDLE_VALUE;
137 }
138
144 bool CanWrite(void) const
145 {
146 return CanRead() && m_boCanWrite;
147 }
148
156 bool GetInformation(LPBY_HANDLE_FILE_INFORMATION _lpFileInformation) const
157 {
158 bool r = !! ApiGetFileInformationByHandle(GetHandle(), _lpFileInformation);
159 return r;
160 }
161
168 LONGLONG GetSize(void) const
169 {
170 ::SetLastError(NO_ERROR);
171 ULARGE_INTEGER r;
172 r.LowPart = ApiGetFileSize(GetHandle(), &r.HighPart);
173 if ( ::GetLastError() != NO_ERROR )
174 {
175 return -1;
176 }
177 return static_cast<LONGLONG>(r.QuadPart);
178 }
179
189 LONGLONG Seek(LONGLONG llOffset, IReader::ESeekMode eSeek = IReader::TOP) const
190 {
191 LARGE_INTEGER r;
192 r.QuadPart = llOffset;
193 r.LowPart = ApiSetFilePointer(GetHandle(), r.LowPart, &r.HighPart, eSeek);
194 if ( r.LowPart == INVALID_SET_FILE_POINTER )
195 {
196 if ( ::GetLastError() != NO_ERROR )
197 {
198 r.QuadPart = -1;
199 }
200 }
201 return r.QuadPart;
202 }
203
211 size_t Read(size_t size, LPVOID _P) const
212 {
213 if ( size > ULONG_MAX )
214 {
215 size = ULONG_MAX;
216 }
217 DWORD dwRead;
218 BOOL boRc = ApiReadFile(GetHandle(), _P, ToDword(size), &dwRead, NULL);
219 if ( ! boRc )
220 {
221 throw CReadFailureException(::GetLastError());
222 }
223 return dwRead;
224 }
225
230 operator HANDLE(void) const
231 {
232 return GetHandle();
233 }
234
239 LPCTSTR GetOpenName(void) const
240 {
241 return m_strName;
242 }
243
248 virtual HANDLE GetHandle(void) const
249 {
250 return m_hhFile;
251 }
252
253protected:
258 virtual void SetHandle(HANDLE h)
259 {
260 m_hhFile = h;
261 }
262
263 #ifndef _TnbDOXYGEN //Document作成用シンボル
264
266 virtual BOOL ApiGetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation) const
267 {
268 return ::GetFileInformationByHandle(hFile, lpFileInformation);
269 }
271 virtual HANDLE ApiCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
272 DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
273 {
274 return ::CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
275 }
277 virtual DWORD ApiGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) const
278 {
279 return ::GetFileSize(hFile, lpFileSizeHigh);
280 }
282 virtual DWORD ApiSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) const
283 {
284 return ::SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
285 }
287 virtual BOOL ApiReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) const
288 {
289 return ::ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
290 }
292 virtual BOOL ApiSetFileTime(HANDLE hFile, CONST ::FILETIME *lpCreationTime, CONST ::FILETIME *lpLastAccessTime, CONST ::FILETIME *lpLastWriteTime)
293 {
294 return ::SetFileTime(hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime);
295 }
297 virtual BOOL ApiSetEndOfFile(HANDLE hFile)
298 {
299 return ::SetEndOfFile(hFile);
300 }
302 virtual BOOL ApiWriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped)
303 {
304 return ::WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
305 }
306
307 #endif // _TnbDOXYGEN
308
309private:
310 mutable CHandleHandle m_hhFile;
311 CStr m_strName;
312 bool m_boCanWrite;
313 DWORD m_attributes;
314};
315
316
317
337class CFileReader : public IReader, public CAbstractFile
338{
339 DEFSUPER(IReader);
340 typedef CAbstractFile _base;
341public:
342
345 {
346 }
347
351 virtual void Close(void)
352 {
353 _base::Close();
354 }
355
364 bool Open(LPCTSTR lpszName, bool boIsShare = true, bool boDummy = false)
365 {
366 return _base::OpenOnMode(lpszName, _base::READ, boIsShare);
367 }
368
373 virtual LPCTSTR GetOpenName(void) const
374 {
375 return _base::GetOpenName();
376 }
377
383 virtual bool CanRead(void) const
384 {
385 return _base::CanRead();
386 }
387
397 virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
398 {
399 return _base::Seek(llOffset, eSeek);
400 }
401
408 virtual LONGLONG GetSize(void) const
409 {
410 return _base::GetSize();
411 }
412
420 virtual size_t Read(size_t size, LPVOID _P) const
421 {
422 return _base::Read(size, _P);
423 }
424
434 static bool ReadAll(CByteVector& _content, LPCTSTR lpszFileName, CFileReader& fr = CFileReader())
435 {
436 if ( fr.Open(lpszFileName) )
437 {
438 try
439 {
440 _content = fr.ReadInto();
441 return true;
442 }
443 catch ( ... )
444 {
445 }
446 }
447 return false;
448 }
449};
450
451
452
474class CFileWriter : public IWriter, public CAbstractFile
475{
476 DEFSUPER(IWriter);
477 typedef CAbstractFile _base;
478public:
479
482 {
483 }
484
488 virtual void Close(void)
489 {
490 _base::Close();
491 }
492
501 bool New(LPCTSTR lpszName, bool boIsShare = true)
502 {
503 return _base::OpenOnMode(lpszName, _base::CREATE, boIsShare);
504 }
505
516 bool Open(LPCTSTR lpszName, bool boIsShare = true, bool boIsBottom = true)
517 {
518 bool r =_base::OpenOnMode(lpszName, _base::ACCESS, boIsShare);
519 if ( r && boIsBottom )
520 {
521 Seek(0, END);
522 }
523 return r;
524 }
525
530 virtual LPCTSTR GetOpenName(void) const
531 {
532 return _base::GetOpenName();
533 }
534
540 virtual bool CanRead(void) const
541 {
542 return _base::CanRead();
543 }
544
550 virtual bool CanWrite(void) const
551 {
552 return _base::CanWrite();
553 }
554
564 virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek = TOP) const
565 {
566 return _base::Seek(llOffset, eSeek);
567 }
568
575 virtual LONGLONG GetSize(void) const
576 {
577 return _base::GetSize();
578 }
579
587 virtual size_t Read(size_t size, LPVOID _P) const
588 {
589 return _base::Read(size, _P);
590 }
591
599 void SetTime(const CFileTimeEx& timeCreation, const CFileTimeEx& timeLastAccess, const CFileTimeEx& timeLastWrite)
600 {
601 BOOL r = ApiSetFileTime(GetHandle(), &timeCreation, &timeLastAccess, &timeLastWrite);
602 if ( ! r )
603 {
604 throw CWriteFailureException(::GetLastError());
605 }
606 }
607
614 virtual void SetEnd(void)
615 {
616 if ( ! ApiSetEndOfFile(GetHandle()) )
617 {
618 throw CWriteFailureException(::GetLastError());
619 }
620 }
621
628 virtual void Write(size_t size, LPCVOID P)
629 {
630 if ( size >= ULONG_MAX )
631 {
632 throw CWriteFailureException(ERROR_BAD_LENGTH);
633 }
634 DWORD dwWrite;
635 bool boRc = !! ApiWriteFile(GetHandle(), P, ToDword(size), &dwWrite, NULL);
636 DWORD dwError = boRc ? 0 : ::GetLastError();
637 if ( ! boRc || size != dwWrite )
638 {
639 throw CWriteFailureException(dwError);
640 }
641 }
642
653 static bool NewFile(LPCTSTR lpszFileName, size_t size, LPCVOID P, CFileWriter& fw = CFileWriter())
654 {
655 if ( fw.New(lpszFileName, false) )
656 {
657 try
658 {
659 fw.Write(size, P);
660 return true;
661 }
662 catch ( ... )
663 {
664 }
665 }
666 return false;
667 }
668
679 static bool AddFile(LPCTSTR lpszFileName, size_t size, LPCVOID P, CFileWriter& fw = CFileWriter())
680 {
681 if ( fw.Open(lpszFileName, false, true/*bottom*/) )
682 {
683 try
684 {
685 fw.Write(size, P);
686 return true;
687 }
688 catch ( ... )
689 {
690 }
691 }
692 return false;
693 }
694};
695
696
697
707inline void SaveCollection(IWriter& wr, LPCTSTR lpszHead, const ISequenceCollectionT<BYTE>& c)
708{
709 //- Head書込み
710 CAscii asc = lpszHead;
711 size_t dwLen = asc.GetLength() + 1;
712 wr.Write(sizeof(DWORD), &dwLen);
713 wr.Write(sizeof(DWORD), &dwLen);
714 wr.Write(dwLen, LPCSTR(asc));
715 //- SUM計算
716 size_t size = c.GetSize();
717 WORD wSum = 0;
718 const BYTE* B = c.ReferBuffer();
719 for ( size_t i = 0; i < size; i++ )
720 {
721 wSum = static_cast<WORD>(wSum + *B++);
722 }
723 //- 書込み
724 wr.Write(sizeof(size_t), &size);
725 wr.Write(size, c.ReferBuffer());
726 wr.Write(sizeof(WORD), &wSum);
727}
728
729
730
740inline void SaveCollection(LPCTSTR lpszFile, LPCTSTR lpszHead, const ISequenceCollectionT<BYTE>& c)
741{
742 CFileWriter fw;
743 if ( ! fw.New(lpszFile, false) )
744 {
745 throw COpenFailureException(::GetLastError());
746 }
747 SaveCollection(fw, lpszHead, c);
748}
749
750
751
763inline void LoadCollection(const IReader& rr, LPCTSTR lpszHead, CVectorT<BYTE>& _vb)
764{
765 //- Head読み込み
766 {
767 CAscii asc;
768 DWORD dwLen1;
769 rr.ReadExactly(sizeof(DWORD), &dwLen1);
770 DWORD dwLen2;
771 rr.ReadExactly(sizeof(DWORD), &dwLen2);
772 if ( dwLen1 != dwLen2 )
773 {
774 throw CNotSupportException();
775 }
776 rr.ReadExactly(dwLen1, asc.GetBuffer(dwLen1));
777 asc.ReleaseBuffer();
778 if ( ! asc.IsEqual(CAscii(lpszHead)) )
779 {
780 throw CNotSupportException();
781 }
782 }
783 //
784 size_t size;
785 rr.ReadExactly(sizeof(size_t), &size);
786 rr.ReadExactly(size, _vb.GetBuffer(size));
787 _vb.ReferBuffer();
788 WORD wFileSum;
789 rr.ReadExactly(sizeof(WORD), &wFileSum);
790 //- SUM計算
791 WORD wSum = 0;
792 const BYTE* B = _vb.ReferBuffer();
793 for ( size_t i = 0; i < size; i++ )
794 {
795 wSum = static_cast<WORD>(wSum + *B++);
796 }
797 if ( wFileSum != wSum )
798 {
799 throw CNoSuchTypeException();
800 }
801}
802
803
804
816inline void LoadCollection(LPCTSTR lpszFile, LPCTSTR lpszHead, CVectorT<BYTE>& _vb)
817{
818 CFileReader fr;
819 if ( ! fr.Open(lpszFile) )
820 {
821 throw COpenFailureException(::GetLastError());
822 }
823 LoadCollection(fr, lpszHead, _vb);
824}
825
826
827
828}; // TNB
ハンドルハンドル関係のヘッダ
時間管理関係のヘッダ
ファイル関係のヘッダ
抽象ファイルクラス
Definition: TnbFile.h:36
bool GetInformation(LPBY_HANDLE_FILE_INFORMATION _lpFileInformation) const
[取得] ファイル情報取得
Definition: TnbFile.h:156
bool OpenOnMode(LPCTSTR lpszName, EMode eMode=ACCESS, bool isShare=true)
[操作] モード付オープン
Definition: TnbFile.h:88
LPCTSTR GetOpenName(void) const
[取得] オープン名取得
Definition: TnbFile.h:239
bool CanRead(void) const
[確認] 読み込み可能か
Definition: TnbFile.h:134
size_t Read(size_t size, LPVOID _P) const
[取得] ファイル読み込み
Definition: TnbFile.h:211
EMode
オープンモード
Definition: TnbFile.h:40
@ ACCESS
読み書きオープン(既存でなければ作成されます)
Definition: TnbFile.h:43
@ CREATE
新規読み書きオープン(既存ファイルは消されます)
Definition: TnbFile.h:42
@ WRITE
書き込みオープン(既存でなければ作成されます)
Definition: TnbFile.h:44
@ READ
読み込みオープン(既存でなければエラーになります)
Definition: TnbFile.h:41
CAbstractFile(void)
コンストラクタ
Definition: TnbFile.h:48
void Close(void)
[操作] クローズ
Definition: TnbFile.h:63
virtual ~CAbstractFile(void)
デストラクタ
Definition: TnbFile.h:53
LONGLONG GetSize(void) const
[取得] ファイルサイズ取得
Definition: TnbFile.h:168
virtual HANDLE GetHandle(void) const
[取得] ファイルハンドル取得
Definition: TnbFile.h:248
void SetCreatedAttributes(DWORD attr)
[設定] 属性設定.
Definition: TnbFile.h:73
bool CanWrite(void) const
[確認] 書込み可能か
Definition: TnbFile.h:144
virtual void SetHandle(HANDLE h)
[設定] ファイルハンドル設定
Definition: TnbFile.h:258
LONGLONG Seek(LONGLONG llOffset, IReader::ESeekMode eSeek=IReader::TOP) const
[操作] シーク.
Definition: TnbFile.h:189
ファイル読み込みクラス
Definition: TnbFile.h:338
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
Definition: TnbFile.h:397
virtual size_t Read(size_t size, LPVOID _P) const
[取得] ファイル読み込み
Definition: TnbFile.h:420
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
Definition: TnbFile.h:364
CFileReader(void)
コンストラクタ
Definition: TnbFile.h:344
virtual LONGLONG GetSize(void) const
[取得] ファイルサイズ取得
Definition: TnbFile.h:408
virtual bool CanRead(void) const
[確認] 読み込み可能か
Definition: TnbFile.h:383
virtual LPCTSTR GetOpenName(void) const
[取得] オープン名取得
Definition: TnbFile.h:373
virtual void Close(void)
[操作] クローズ
Definition: TnbFile.h:351
static bool ReadAll(CByteVector &_content, LPCTSTR lpszFileName, CFileReader &fr=CFileReader())
[取得] ファイル全読み込み.
Definition: TnbFile.h:434
ファイルタイム管理クラス
Definition: TnbTime.h:45
ファイル書き込みクラス
Definition: TnbFile.h:475
static bool AddFile(LPCTSTR lpszFileName, size_t size, LPCVOID P, CFileWriter &fw=CFileWriter())
[保存] ファイル追加.
Definition: TnbFile.h:679
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const
[操作] シーク.
Definition: TnbFile.h:564
virtual size_t Read(size_t size, LPVOID _P) const
[取得] ファイル読み込み
Definition: TnbFile.h:587
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boIsBottom=true)
[操作] オープン.
Definition: TnbFile.h:516
void SetTime(const CFileTimeEx &timeCreation, const CFileTimeEx &timeLastAccess, const CFileTimeEx &timeLastWrite)
[設定] ファイル日付設定
Definition: TnbFile.h:599
virtual LONGLONG GetSize(void) const
[取得] ファイルサイズ取得
Definition: TnbFile.h:575
bool New(LPCTSTR lpszName, bool boIsShare=true)
[操作] 新規オープン.
Definition: TnbFile.h:501
virtual bool CanRead(void) const
[確認] 読み込み可能か
Definition: TnbFile.h:540
static bool NewFile(LPCTSTR lpszFileName, size_t size, LPCVOID P, CFileWriter &fw=CFileWriter())
[保存] ファイル作成.
Definition: TnbFile.h:653
CFileWriter(void)
コンストラクタ
Definition: TnbFile.h:481
virtual LPCTSTR GetOpenName(void) const
[取得] オープン名取得
Definition: TnbFile.h:530
virtual void Close(void)
[操作] クローズ
Definition: TnbFile.h:488
virtual void Write(size_t size, LPCVOID P)
[保存] ファイル書き込み
Definition: TnbFile.h:628
virtual void SetEnd(void)
[設定] EOFを指定.
Definition: TnbFile.h:614
virtual bool CanWrite(void) const
[確認] 書込み可能か
Definition: TnbFile.h:550
HANDLE型ハンドルハンドル
タイプ相違例外
Definition: TnbException.h:146
サポート外例外
Definition: TnbException.h:185
オープン失敗発生例外
Definition: TnbException.h:227
読み込み失敗発生例外
Definition: TnbException.h:241
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
bool IsEqual(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:669
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
TYP * GetBuffer(size_t size=0)
[操作] データアドレス取得
Definition: TnbVector.h:745
virtual const TYP * ReferBuffer(void) const
[取得] データアドレス取得
Definition: TnbVector.h:664
書き込み失敗発生例外
Definition: TnbException.h:255
void LoadCollection(const IReader &rr, LPCTSTR lpszHead, CVectorT< BYTE > &_vb)
[保存] コレクション読み込み
Definition: TnbFile.h:763
void SaveCollection(IWriter &wr, LPCTSTR lpszHead, const ISequenceCollectionT< BYTE > &c)
[保存] BYTEコレクション書き込み
Definition: TnbFile.h:707
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:395
TNB Library
Definition: TnbDoxyTitle.txt:2
読み込みインターフェース
Definition: TnbReader.h:36
void ReadExactly(size_t size, LPVOID _P) const
[取得] 読み込み.
Definition: TnbReader.h:114
ESeekMode
シークのオフセット指定モード
Definition: TnbReader.h:39
@ TOP
頭からのオフセット指定
Definition: TnbReader.h:40
@ END
末からのオフセット指定
Definition: TnbReader.h:42
virtual const TYP * ReferBuffer(void) const =0
[取得] データアドレス取得.
virtual size_t GetSize(void) const =0
[取得] 要素数取得.
書き込みインターフェース
Definition: TnbWriter.h:36
virtual void Write(size_t size, LPCVOID P)=0
[保存] 書き込み