Hex Artifact Content

Not logged in

Artifact 41942e064e2938757db4daba32a368312b8e3bec:


0000: 23 69 6e 63 6c 75 64 65 20 22 73 74 64 61 66 78  #include "stdafx
0010: 2e 68 22 0d 0a 23 69 6e 63 6c 75 64 65 20 22 66  .h"..#include "f
0020: 69 6c 65 2e 68 22 0d 0a 75 73 69 6e 67 20 6e 61  ile.h"..using na
0030: 6d 65 73 70 61 63 65 20 6b 69 3b 0d 0a 0d 0a 0d  mespace ki;.....
0040: 0a 0d 0a 2f 2f 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ...//===========
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a  ==============..
0090: 0d 0a 46 69 6c 65 52 3a 3a 46 69 6c 65 52 28 29  ..FileR::FileR()
00a0: 0d 0a 09 3a 20 68 61 6e 64 6c 65 5f 20 28 20 49  ...: handle_ ( I
00b0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
00c0: 4c 55 45 20 29 0d 0a 09 2c 20 66 6d 6f 5f 20 20  LUE )..., fmo_  
00d0: 20 20 28 20 4e 55 4c 4c 20 29 0d 0a 09 2c 20 62    ( NULL )..., b
00e0: 61 73 65 50 74 72 5f 28 20 4e 55 4c 4c 20 29 0d  asePtr_( NULL ).
00f0: 0a 7b 0d 0a 7d 0d 0a 0d 0a 46 69 6c 65 52 3a 3a  .{..}....FileR::
0100: 7e 46 69 6c 65 52 28 29 0d 0a 7b 0d 0a 09 43 6c  ~FileR()..{...Cl
0110: 6f 73 65 28 29 3b 0d 0a 7d 0d 0a 0d 0a 62 6f 6f  ose();..}....boo
0120: 6c 20 46 69 6c 65 52 3a 3a 4f 70 65 6e 28 20 63  l FileR::Open( c
0130: 6f 6e 73 74 20 54 43 48 41 52 2a 20 66 6e 61 6d  onst TCHAR* fnam
0140: 65 20 29 0d 0a 7b 0d 0a 09 43 6c 6f 73 65 28 29  e )..{...Close()
0150: 3b 0d 0a 0d 0a 09 2f 2f 20 83 74 83 40 83 43 83  ;.....// .t.@.C.
0160: 8b 82 f0 93 c7 82 dd 82 c6 82 e8 90 ea 97 70 82  ..............p.
0170: c5 8a 4a 82 ad 0d 0a 09 68 61 6e 64 6c 65 5f 20  ..J.....handle_ 
0180: 3d 20 3a 3a 43 72 65 61 74 65 46 69 6c 65 28 0d  = ::CreateFile(.
0190: 0a 09 09 66 6e 61 6d 65 2c 20 47 45 4e 45 52 49  ...fname, GENERI
01a0: 43 5f 52 45 41 44 2c 0d 0a 09 09 46 49 4c 45 5f  C_READ,....FILE_
01b0: 53 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f  SHARE_READ|FILE_
01c0: 53 48 41 52 45 5f 57 52 49 54 45 2c 0d 0a 09 09  SHARE_WRITE,....
01d0: 4e 55 4c 4c 2c 20 4f 50 45 4e 5f 45 58 49 53 54  NULL, OPEN_EXIST
01e0: 49 4e 47 2c 0d 0a 09 09 46 49 4c 45 5f 41 54 54  ING,....FILE_ATT
01f0: 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 7c 46 49  RIBUTE_NORMAL|FI
0200: 4c 45 5f 46 4c 41 47 5f 53 45 51 55 45 4e 54 49  LE_FLAG_SEQUENTI
0210: 41 4c 5f 53 43 41 4e 2c 20 4e 55 4c 4c 0d 0a 09  AL_SCAN, NULL...
0220: 29 3b 0d 0a 09 69 66 28 20 68 61 6e 64 6c 65 5f  );...if( handle_
0230: 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44   == INVALID_HAND
0240: 4c 45 5f 56 41 4c 55 45 20 29 0d 0a 09 09 72 65  LE_VALUE )....re
0250: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 09  turn false;.....
0260: 2f 2f 20 83 54 83 43 83 59 82 f0 8e e6 93 be 0d  // .T.C.Y.......
0270: 0a 09 73 69 7a 65 5f 20 3d 20 3a 3a 47 65 74 46  ..size_ = ::GetF
0280: 69 6c 65 53 69 7a 65 28 20 68 61 6e 64 6c 65 5f  ileSize( handle_
0290: 2c 20 4e 55 4c 4c 20 29 3b 0d 0a 0d 0a 09 69 66  , NULL );.....if
02a0: 28 20 73 69 7a 65 5f 3d 3d 30 20 29 0d 0a 09 7b  ( size_==0 )...{
02b0: 0d 0a 09 09 2f 2f 20 30 83 6f 83 43 83 67 82 cc  ....// 0.o.C.g..
02c0: 83 74 83 40 83 43 83 8b 82 cd 83 7d 83 62 83 73  .t.@.C.....}.b.s
02d0: 83 93 83 4f 8f 6f 97 88 82 c8 82 a2 82 cc 82 c5  ...O.o..........
02e0: 93 4b 93 96 82 c9 89 f1 94 f0 0d 0a 09 09 62 61  .K............ba
02f0: 73 65 50 74 72 5f 20 3d 20 26 73 69 7a 65 5f 3b  sePtr_ = &size_;
0300: 0d 0a 09 7d 0d 0a 09 65 6c 73 65 0d 0a 09 7b 0d  ...}...else...{.
0310: 0a 09 09 2f 2f 20 83 7d 83 62 83 73 83 93 83 4f  ...// .}.b.s...O
0320: 83 49 83 75 83 57 83 46 83 4e 83 67 82 f0 8d ec  .I.u.W.F.N.g....
0330: 82 e9 0d 0a 09 09 66 6d 6f 5f 20 3d 20 3a 3a 43  ......fmo_ = ::C
0340: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
0350: 28 0d 0a 09 09 09 68 61 6e 64 6c 65 5f 2c 20 4e  (.....handle_, N
0360: 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 4f 4e  ULL, PAGE_READON
0370: 4c 59 2c 20 30 2c 20 30 2c 20 4e 55 4c 4c 20 29  LY, 0, 0, NULL )
0380: 3b 0d 0a 09 09 69 66 28 20 66 6d 6f 5f 20 3d 3d  ;....if( fmo_ ==
0390: 20 4e 55 4c 4c 20 29 0d 0a 09 09 7b 0d 0a 09 09   NULL )....{....
03a0: 09 3a 3a 43 6c 6f 73 65 48 61 6e 64 6c 65 28 20  .::CloseHandle( 
03b0: 68 61 6e 64 6c 65 5f 20 29 3b 0d 0a 09 09 09 68  handle_ );.....h
03c0: 61 6e 64 6c 65 5f 20 3d 20 49 4e 56 41 4c 49 44  andle_ = INVALID
03d0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0d 0a  _HANDLE_VALUE;..
03e0: 09 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b  ...return false;
03f0: 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 2f 2f 20 83 72  ....}......// .r
0400: 83 85 81 5b 0d 0a 09 09 62 61 73 65 50 74 72 5f  ...[....basePtr_
0410: 20 3d 20 3a 3a 4d 61 70 56 69 65 77 4f 66 46 69   = ::MapViewOfFi
0420: 6c 65 28 20 66 6d 6f 5f 2c 20 46 49 4c 45 5f 4d  le( fmo_, FILE_M
0430: 41 50 5f 52 45 41 44 2c 20 30 2c 20 30 2c 20 30  AP_READ, 0, 0, 0
0440: 20 29 3b 0d 0a 09 09 69 66 28 20 62 61 73 65 50   );....if( baseP
0450: 74 72 5f 20 3d 3d 20 4e 55 4c 4c 20 29 0d 0a 09  tr_ == NULL )...
0460: 09 7b 0d 0a 09 09 09 3a 3a 43 6c 6f 73 65 48 61  .{.....::CloseHa
0470: 6e 64 6c 65 28 20 66 6d 6f 5f 20 29 3b 0d 0a 09  ndle( fmo_ );...
0480: 09 09 3a 3a 43 6c 6f 73 65 48 61 6e 64 6c 65 28  ..::CloseHandle(
0490: 20 68 61 6e 64 6c 65 5f 20 29 3b 0d 0a 09 09 09   handle_ );.....
04a0: 68 61 6e 64 6c 65 5f 20 3d 20 49 4e 56 41 4c 49  handle_ = INVALI
04b0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0d  D_HANDLE_VALUE;.
04c0: 0a 09 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65  ....return false
04d0: 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 09 72 65 74  ;....}...}...ret
04e0: 75 72 6e 20 74 72 75 65 3b 0d 0a 7d 0d 0a 0d 0a  urn true;..}....
04f0: 76 6f 69 64 20 46 69 6c 65 52 3a 3a 43 6c 6f 73  void FileR::Clos
0500: 65 28 29 0d 0a 7b 0d 0a 09 69 66 28 20 68 61 6e  e()..{...if( han
0510: 64 6c 65 5f 20 21 3d 20 49 4e 56 41 4c 49 44 5f  dle_ != INVALID_
0520: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 0d 0a  HANDLE_VALUE )..
0530: 09 7b 0d 0a 09 09 2f 2f 20 83 77 83 93 83 65 83  .{....// .w...e.
0540: 52 83 7d 83 62 83 73 83 93 83 4f 82 f0 82 b5 82  R.}.b.s...O.....
0550: c4 82 c8 82 af 82 ea 82 ce 82 b1 82 b1 82 c5 89  ................
0560: f0 95 fa 0d 0a 09 09 69 66 28 20 62 61 73 65 50  .......if( baseP
0570: 74 72 5f 20 21 3d 20 26 73 69 7a 65 5f 20 29 0d  tr_ != &size_ ).
0580: 0a 09 09 09 3a 3a 55 6e 6d 61 70 56 69 65 77 4f  ....::UnmapViewO
0590: 66 46 69 6c 65 28 20 63 6f 6e 73 74 5f 63 61 73  fFile( const_cas
05a0: 74 3c 76 6f 69 64 2a 3e 28 62 61 73 65 50 74 72  t<void*>(basePtr
05b0: 5f 29 20 29 3b 0d 0a 09 09 62 61 73 65 50 74 72  _) );....basePtr
05c0: 5f 20 3d 20 4e 55 4c 4c 3b 0d 0a 0d 0a 09 09 69  _ = NULL;......i
05d0: 66 28 20 66 6d 6f 5f 20 21 3d 20 4e 55 4c 4c 20  f( fmo_ != NULL 
05e0: 29 0d 0a 09 09 09 3a 3a 43 6c 6f 73 65 48 61 6e  ).....::CloseHan
05f0: 64 6c 65 28 20 66 6d 6f 5f 20 29 3b 0d 0a 09 09  dle( fmo_ );....
0600: 66 6d 6f 5f 20 3d 20 4e 55 4c 4c 3b 0d 0a 0d 0a  fmo_ = NULL;....
0610: 09 09 3a 3a 43 6c 6f 73 65 48 61 6e 64 6c 65 28  ..::CloseHandle(
0620: 20 68 61 6e 64 6c 65 5f 20 29 3b 0d 0a 09 09 68   handle_ );....h
0630: 61 6e 64 6c 65 5f 20 3d 20 49 4e 56 41 4c 49 44  andle_ = INVALID
0640: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0d 0a  _HANDLE_VALUE;..
0650: 09 7d 0d 0a 7d 0d 0a 0d 0a 0d 0a 0d 0a 2f 2f 3d  .}..}........//=
0660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06a0: 3d 3d 3d 3d 3d 3d 3d 3d 0d 0a 0d 0a 46 69 6c 65  ========....File
06b0: 57 3a 3a 46 69 6c 65 57 28 29 0d 0a 09 3a 20 42  W::FileW()...: B
06c0: 55 46 53 49 5a 45 28 20 36 35 35 33 36 20 29 0d  UFSIZE( 65536 ).
06d0: 0a 09 2c 20 68 61 6e 64 6c 65 5f 28 20 49 4e 56  .., handle_( INV
06e0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
06f0: 45 20 29 0d 0a 09 2c 20 62 75 66 5f 20 20 20 28  E )..., buf_   (
0700: 20 6e 65 77 20 75 63 68 61 72 5b 42 55 46 53 49   new uchar[BUFSI
0710: 5a 45 5d 20 29 0d 0a 7b 0d 0a 7d 0d 0a 0d 0a 46  ZE] )..{..}....F
0720: 69 6c 65 57 3a 3a 7e 46 69 6c 65 57 28 29 0d 0a  ileW::~FileW()..
0730: 7b 0d 0a 09 43 6c 6f 73 65 28 29 3b 0d 0a 09 64  {...Close();...d
0740: 65 6c 65 74 65 20 5b 5d 20 62 75 66 5f 3b 0d 0a  elete [] buf_;..
0750: 7d 0d 0a 0d 0a 69 6e 6c 69 6e 65 20 76 6f 69 64  }....inline void
0760: 20 46 69 6c 65 57 3a 3a 46 6c 75 73 68 28 29 0d   FileW::Flush().
0770: 0a 7b 0d 0a 09 44 57 4f 52 44 20 64 75 6d 6d 79  .{...DWORD dummy
0780: 3b 0d 0a 09 3a 3a 57 72 69 74 65 46 69 6c 65 28  ;...::WriteFile(
0790: 20 68 61 6e 64 6c 65 5f 2c 20 62 75 66 5f 2c 20   handle_, buf_, 
07a0: 62 50 6f 73 5f 2c 20 26 64 75 6d 6d 79 2c 20 4e  bPos_, &dummy, N
07b0: 55 4c 4c 20 29 3b 0d 0a 09 62 50 6f 73 5f 20 3d  ULL );...bPos_ =
07c0: 20 30 3b 0d 0a 7d 0d 0a 0d 0a 62 6f 6f 6c 20 46   0;..}....bool F
07d0: 69 6c 65 57 3a 3a 4f 70 65 6e 28 20 63 6f 6e 73  ileW::Open( cons
07e0: 74 20 54 43 48 41 52 2a 20 66 6e 61 6d 65 2c 20  t TCHAR* fname, 
07f0: 62 6f 6f 6c 20 63 72 65 61 74 20 29 0d 0a 7b 0d  bool creat )..{.
0800: 0a 09 43 6c 6f 73 65 28 29 3b 0d 0a 0d 0a 09 2f  ..Close();...../
0810: 2f 20 83 74 83 40 83 43 83 8b 82 f0 8f 91 82 ab  / .t.@.C........
0820: 8d 9e 82 dd 90 ea 97 70 82 c5 8a 4a 82 ad 0d 0a  .......p...J....
0830: 09 68 61 6e 64 6c 65 5f 20 3d 20 3a 3a 43 72 65  .handle_ = ::Cre
0840: 61 74 65 46 69 6c 65 28 20 66 6e 61 6d 65 2c 0d  ateFile( fname,.
0850: 0a 09 09 47 45 4e 45 52 49 43 5f 57 52 49 54 45  ...GENERIC_WRITE
0860: 2c 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  , FILE_SHARE_REA
0870: 44 2c 20 4e 55 4c 4c 2c 0d 0a 09 09 63 72 65 61  D, NULL,....crea
0880: 74 20 3f 20 43 52 45 41 54 45 5f 41 4c 57 41 59  t ? CREATE_ALWAY
0890: 53 20 3a 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  S : OPEN_EXISTIN
08a0: 47 2c 0d 0a 09 09 46 49 4c 45 5f 41 54 54 52 49  G,....FILE_ATTRI
08b0: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
08c0: 4c 45 5f 46 4c 41 47 5f 53 45 51 55 45 4e 54 49  LE_FLAG_SEQUENTI
08d0: 41 4c 5f 53 43 41 4e 2c 20 4e 55 4c 4c 20 29 3b  AL_SCAN, NULL );
08e0: 0d 0a 09 69 66 28 20 68 61 6e 64 6c 65 5f 20 3d  ...if( handle_ =
08f0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
0900: 5f 56 41 4c 55 45 20 29 0d 0a 09 09 72 65 74 75  _VALUE )....retu
0910: 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 09 62 50  rn false;.....bP
0920: 6f 73 5f 20 3d 20 30 3b 0d 0a 09 72 65 74 75 72  os_ = 0;...retur
0930: 6e 20 74 72 75 65 3b 0d 0a 7d 0d 0a 0d 0a 76 6f  n true;..}....vo
0940: 69 64 20 46 69 6c 65 57 3a 3a 43 6c 6f 73 65 28  id FileW::Close(
0950: 29 0d 0a 7b 0d 0a 09 69 66 28 20 68 61 6e 64 6c  )..{...if( handl
0960: 65 5f 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41  e_ != INVALID_HA
0970: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 0d 0a 09 7b  NDLE_VALUE )...{
0980: 0d 0a 09 09 46 6c 75 73 68 28 29 3b 0d 0a 09 09  ....Flush();....
0990: 3a 3a 43 6c 6f 73 65 48 61 6e 64 6c 65 28 20 68  ::CloseHandle( h
09a0: 61 6e 64 6c 65 5f 20 29 3b 0d 0a 09 09 68 61 6e  andle_ );....han
09b0: 64 6c 65 5f 20 3d 20 49 4e 56 41 4c 49 44 5f 48  dle_ = INVALID_H
09c0: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0d 0a 09 7d  ANDLE_VALUE;...}
09d0: 0d 0a 7d 0d 0a 0d 0a 76 6f 69 64 20 46 69 6c 65  ..}....void File
09e0: 57 3a 3a 57 72 69 74 65 28 20 63 6f 6e 73 74 20  W::Write( const 
09f0: 76 6f 69 64 2a 20 64 61 74 2c 20 75 6c 6f 6e 67  void* dat, ulong
0a00: 20 73 69 7a 20 29 0d 0a 7b 0d 0a 09 63 6f 6e 73   siz )..{...cons
0a10: 74 20 75 63 68 61 72 2a 20 75 64 61 74 20 3d 20  t uchar* udat = 
0a20: 73 74 61 74 69 63 5f 63 61 73 74 3c 63 6f 6e 73  static_cast<cons
0a30: 74 20 75 63 68 61 72 2a 3e 28 64 61 74 29 3b 0d  t uchar*>(dat);.
0a40: 0a 0d 0a 09 77 68 69 6c 65 28 20 28 42 55 46 53  ....while( (BUFS
0a50: 49 5a 45 2d 62 50 6f 73 5f 29 20 3c 3d 20 73 69  IZE-bPos_) <= si
0a60: 7a 20 29 0d 0a 09 7b 0d 0a 09 09 6d 65 6d 6d 6f  z )...{....memmo
0a70: 76 65 28 20 62 75 66 5f 2b 62 50 6f 73 5f 2c 20  ve( buf_+bPos_, 
0a80: 75 64 61 74 2c 20 42 55 46 53 49 5a 45 2d 62 50  udat, BUFSIZE-bP
0a90: 6f 73 5f 20 29 3b 0d 0a 09 09 73 69 7a 20 20 2d  os_ );....siz  -
0aa0: 3d 20 28 42 55 46 53 49 5a 45 2d 62 50 6f 73 5f  = (BUFSIZE-bPos_
0ab0: 29 3b 0d 0a 09 09 75 64 61 74 20 2b 3d 20 28 42  );....udat += (B
0ac0: 55 46 53 49 5a 45 2d 62 50 6f 73 5f 29 3b 0d 0a  UFSIZE-bPos_);..
0ad0: 09 09 62 50 6f 73 5f 20 3d 20 42 55 46 53 49 5a  ..bPos_ = BUFSIZ
0ae0: 45 3b 0d 0a 09 09 46 6c 75 73 68 28 29 3b 0d 0a  E;....Flush();..
0af0: 09 7d 0d 0a 0d 0a 09 6d 65 6d 6d 6f 76 65 28 20  .}.....memmove( 
0b00: 62 75 66 5f 2b 62 50 6f 73 5f 2c 20 75 64 61 74  buf_+bPos_, udat
0b10: 2c 20 73 69 7a 20 29 3b 0d 0a 09 62 50 6f 73 5f  , siz );...bPos_
0b20: 20 2b 3d 20 73 69 7a 3b 0d 0a 7d 0d 0a 0d 0a 76   += siz;..}....v
0b30: 6f 69 64 20 46 69 6c 65 57 3a 3a 57 72 69 74 65  oid FileW::Write
0b40: 43 28 20 75 63 68 61 72 20 63 68 20 29 0d 0a 7b  C( uchar ch )..{
0b50: 0d 0a 09 69 66 28 20 28 42 55 46 53 49 5a 45 2d  ...if( (BUFSIZE-
0b60: 62 50 6f 73 5f 29 20 3c 3d 20 31 20 29 0d 0a 09  bPos_) <= 1 )...
0b70: 09 46 6c 75 73 68 28 29 3b 0d 0a 0d 0a 09 62 75  .Flush();.....bu
0b80: 66 5f 5b 62 50 6f 73 5f 2b 2b 5d 20 3d 20 63 68  f_[bPos_++] = ch
0b90: 3b 0d 0a 7d 0d 0a 0d 0a                          ;..}....