File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: //--- K.I.LIB ---
13b7203622 2011-02-23        kinaba: // kl_file.cpp : file operations
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "kilib.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //--------------------------- static --------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: __int64 kiFile::getSize64( const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	HANDLE h = ::CreateFile( fname,
13b7203622 2011-02-23        kinaba: 				GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,
13b7203622 2011-02-23        kinaba: 				NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
13b7203622 2011-02-23        kinaba: 	if( h==INVALID_HANDLE_VALUE )
13b7203622 2011-02-23        kinaba: 		return 0;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	DWORD low, hi;
13b7203622 2011-02-23        kinaba: 	low = ::GetFileSize( h, &hi );
13b7203622 2011-02-23        kinaba: 	::CloseHandle( h );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return (__int64(hi)<<32) | low;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: unsigned long kiFile::getSize( const char* fname, unsigned long err )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	HANDLE h = ::CreateFile( fname,
13b7203622 2011-02-23        kinaba: 				GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,
13b7203622 2011-02-23        kinaba: 				NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
13b7203622 2011-02-23        kinaba: 	if( h==INVALID_HANDLE_VALUE )
13b7203622 2011-02-23        kinaba: 		return err;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	unsigned long ans = ::GetFileSize( h, NULL );
13b7203622 2011-02-23        kinaba: 	::CloseHandle( h );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return ans==0xffffffff ? err : ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //--------------------------- 結んで開いて --------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool kiFile::open( const char* filename, bool read, bool create )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	close();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( m_bReadMode = read )
13b7203622 2011-02-23        kinaba: 		m_hFile = ::CreateFile( filename,
13b7203622 2011-02-23        kinaba: 				GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
13b7203622 2011-02-23        kinaba: 				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		m_hFile = ::CreateFile( filename,
13b7203622 2011-02-23        kinaba: 				GENERIC_WRITE, FILE_SHARE_READ, NULL,
13b7203622 2011-02-23        kinaba: 				create ? CREATE_ALWAYS : OPEN_EXISTING,
13b7203622 2011-02-23        kinaba: 				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
13b7203622 2011-02-23        kinaba: 	if( m_hFile == INVALID_HANDLE_VALUE )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	m_nBufPos = 0;
13b7203622 2011-02-23        kinaba: 	if( m_bReadMode )
13b7203622 2011-02-23        kinaba: 		flush();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return true;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiFile::close()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_hFile != INVALID_HANDLE_VALUE )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( !m_bReadMode )
13b7203622 2011-02-23        kinaba: 			flush();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		::CloseHandle( m_hFile );
13b7203622 2011-02-23        kinaba: 		m_hFile = INVALID_HANDLE_VALUE;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------------------------- 読み書き ----------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: unsigned long kiFile::read( unsigned char* buf, unsigned long len )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	unsigned long ans = 0;
13b7203622 2011-02-23        kinaba: 	if( m_nBufSize!=0 && m_hFile!=INVALID_HANDLE_VALUE && m_bReadMode )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		while( (m_nBufSize-m_nBufPos) <= len )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			ans += (m_nBufSize-m_nBufPos);
13b7203622 2011-02-23        kinaba: 			ki_memcpy( buf, m_pBuf+m_nBufPos, m_nBufSize-m_nBufPos );
13b7203622 2011-02-23        kinaba: 			len -= (m_nBufSize-m_nBufPos);
13b7203622 2011-02-23        kinaba: 			buf += (m_nBufSize-m_nBufPos);
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			flush();
13b7203622 2011-02-23        kinaba: 			if( m_nBufSize == 0 )
13b7203622 2011-02-23        kinaba: 				return ans;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		ans += len;
13b7203622 2011-02-23        kinaba: 		ki_memcpy( buf, m_pBuf+m_nBufPos, len );
13b7203622 2011-02-23        kinaba: 		m_nBufPos += len;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiFile::write( const void* buf, unsigned long len )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode )
13b7203622 2011-02-23        kinaba: 		return;
13b7203622 2011-02-23        kinaba: 	const unsigned char* ubuf = (const unsigned char*)buf;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	while( (kifile_bufsize-m_nBufPos) <= len )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		ki_memcpy( m_pBuf+m_nBufPos, buf, (kifile_bufsize-m_nBufPos) );
13b7203622 2011-02-23        kinaba: 		len -= (kifile_bufsize-m_nBufPos);
13b7203622 2011-02-23        kinaba: 		ubuf += (kifile_bufsize-m_nBufPos);
13b7203622 2011-02-23        kinaba: 		m_nBufPos = kifile_bufsize;
13b7203622 2011-02-23        kinaba: 		flush();
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	ki_memcpy( m_pBuf+m_nBufPos, ubuf, len );
13b7203622 2011-02-23        kinaba: 	m_nBufPos += len;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #undef putc
13b7203622 2011-02-23        kinaba: void kiFile::putc( unsigned char c )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode )
13b7203622 2011-02-23        kinaba: 		return;
13b7203622 2011-02-23        kinaba: 	if( (kifile_bufsize-m_nBufPos) <= 1 )
13b7203622 2011-02-23        kinaba: 		flush();
13b7203622 2011-02-23        kinaba: 	m_pBuf[ m_nBufPos++ ] = c;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #undef getc
13b7203622 2011-02-23        kinaba: int kiFile::getc()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_nBufSize==0 || m_hFile==INVALID_HANDLE_VALUE || !m_bReadMode )
13b7203622 2011-02-23        kinaba: 		return -1;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( 0==(m_nBufSize-m_nBufPos) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		flush();
13b7203622 2011-02-23        kinaba: 		if( m_nBufSize==0 )
13b7203622 2011-02-23        kinaba: 			return -1;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	if( 1==(m_nBufSize-m_nBufPos) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		int ans = m_pBuf[ m_nBufPos++ ];
13b7203622 2011-02-23        kinaba: 		flush();
13b7203622 2011-02-23        kinaba: 		return ans;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return m_pBuf[ m_nBufPos++ ];
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void kiFile::flush()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_bReadMode )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		::ReadFile( m_hFile, m_pBuf, kifile_bufsize, &m_nBufSize, NULL );
13b7203622 2011-02-23        kinaba: 		m_nBufPos = 0;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		::WriteFile( m_hFile, m_pBuf, m_nBufPos, &m_nBufSize, NULL );
13b7203622 2011-02-23        kinaba: 		m_nBufSize = m_nBufPos = 0;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }