dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "file.h" dcdd144598 2011-02-23 kinaba: using namespace ki; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: FileR::FileR() dcdd144598 2011-02-23 kinaba: : handle_ ( INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: , fmo_ ( NULL ) dcdd144598 2011-02-23 kinaba: , basePtr_( NULL ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: FileR::~FileR() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Close(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool FileR::Open( const TCHAR* fname ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Close(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ファイルを読みとり専用で開く dcdd144598 2011-02-23 kinaba: handle_ = ::CreateFile( dcdd144598 2011-02-23 kinaba: fname, GENERIC_READ, dcdd144598 2011-02-23 kinaba: FILE_SHARE_READ|FILE_SHARE_WRITE, dcdd144598 2011-02-23 kinaba: NULL, OPEN_EXISTING, dcdd144598 2011-02-23 kinaba: FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL dcdd144598 2011-02-23 kinaba: ); dcdd144598 2011-02-23 kinaba: if( handle_ == INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // サイズを取得 dcdd144598 2011-02-23 kinaba: size_ = ::GetFileSize( handle_, NULL ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( size_==0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 0バイトのファイルはマッピング出来ないので適当に回避 dcdd144598 2011-02-23 kinaba: basePtr_ = &size_; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // マッピングオブジェクトを作る dcdd144598 2011-02-23 kinaba: fmo_ = ::CreateFileMapping( dcdd144598 2011-02-23 kinaba: handle_, NULL, PAGE_READONLY, 0, 0, NULL ); dcdd144598 2011-02-23 kinaba: if( fmo_ == NULL ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ::CloseHandle( handle_ ); dcdd144598 2011-02-23 kinaba: handle_ = INVALID_HANDLE_VALUE; dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ビュー dcdd144598 2011-02-23 kinaba: basePtr_ = ::MapViewOfFile( fmo_, FILE_MAP_READ, 0, 0, 0 ); dcdd144598 2011-02-23 kinaba: if( basePtr_ == NULL ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ::CloseHandle( fmo_ ); dcdd144598 2011-02-23 kinaba: ::CloseHandle( handle_ ); dcdd144598 2011-02-23 kinaba: handle_ = INVALID_HANDLE_VALUE; dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void FileR::Close() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( handle_ != INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ヘンテコマッピングをしてなければここで解放 dcdd144598 2011-02-23 kinaba: if( basePtr_ != &size_ ) dcdd144598 2011-02-23 kinaba: ::UnmapViewOfFile( const_cast<void*>(basePtr_) ); dcdd144598 2011-02-23 kinaba: basePtr_ = NULL; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( fmo_ != NULL ) dcdd144598 2011-02-23 kinaba: ::CloseHandle( fmo_ ); dcdd144598 2011-02-23 kinaba: fmo_ = NULL; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ::CloseHandle( handle_ ); dcdd144598 2011-02-23 kinaba: handle_ = INVALID_HANDLE_VALUE; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: FileW::FileW() dcdd144598 2011-02-23 kinaba: : BUFSIZE( 65536 ) dcdd144598 2011-02-23 kinaba: , handle_( INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: , buf_ ( new uchar[BUFSIZE] ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: FileW::~FileW() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Close(); dcdd144598 2011-02-23 kinaba: delete [] buf_; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void FileW::Flush() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DWORD dummy; dcdd144598 2011-02-23 kinaba: ::WriteFile( handle_, buf_, bPos_, &dummy, NULL ); dcdd144598 2011-02-23 kinaba: bPos_ = 0; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool FileW::Open( const TCHAR* fname, bool creat ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Close(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ファイルを書き込み専用で開く dcdd144598 2011-02-23 kinaba: handle_ = ::CreateFile( fname, dcdd144598 2011-02-23 kinaba: GENERIC_WRITE, FILE_SHARE_READ, NULL, dcdd144598 2011-02-23 kinaba: creat ? CREATE_ALWAYS : OPEN_EXISTING, dcdd144598 2011-02-23 kinaba: FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); dcdd144598 2011-02-23 kinaba: if( handle_ == INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bPos_ = 0; dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void FileW::Close() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( handle_ != INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Flush(); dcdd144598 2011-02-23 kinaba: ::CloseHandle( handle_ ); dcdd144598 2011-02-23 kinaba: handle_ = INVALID_HANDLE_VALUE; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void FileW::Write( const void* dat, ulong siz ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const uchar* udat = static_cast<const uchar*>(dat); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: while( (BUFSIZE-bPos_) <= siz ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: memmove( buf_+bPos_, udat, BUFSIZE-bPos_ ); dcdd144598 2011-02-23 kinaba: siz -= (BUFSIZE-bPos_); dcdd144598 2011-02-23 kinaba: udat += (BUFSIZE-bPos_); dcdd144598 2011-02-23 kinaba: bPos_ = BUFSIZE; dcdd144598 2011-02-23 kinaba: Flush(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: memmove( buf_+bPos_, udat, siz ); dcdd144598 2011-02-23 kinaba: bPos_ += siz; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void FileW::WriteC( uchar ch ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( (BUFSIZE-bPos_) <= 1 ) dcdd144598 2011-02-23 kinaba: Flush(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: buf_[bPos_++] = ch; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: