File Annotation

Not logged in
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: