Artifact Content

Not logged in

Artifact 0fee3831c01ce648377ce800d9275b2e7667ccae


     1  //--- K.I.LIB ---
     2  // kl_file.cpp : file operations
     3  
     4  #include "stdafx.h"
     5  #include "kilib.h"
     6  
     7  //--------------------------- static --------------------------//
     8  
     9  __int64 kiFile::getSize64( const char* fname )
    10  {
    11  	HANDLE h = ::CreateFile( fname,
    12  				GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,
    13  				NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
    14  	if( h==INVALID_HANDLE_VALUE )
    15  		return 0;
    16  
    17  	DWORD low, hi;
    18  	low = ::GetFileSize( h, &hi );
    19  	::CloseHandle( h );
    20  
    21  	return (__int64(hi)<<32) | low;
    22  }
    23  
    24  unsigned long kiFile::getSize( const char* fname, unsigned long err )
    25  {
    26  	HANDLE h = ::CreateFile( fname,
    27  				GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,
    28  				NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
    29  	if( h==INVALID_HANDLE_VALUE )
    30  		return err;
    31  
    32  	unsigned long ans = ::GetFileSize( h, NULL );
    33  	::CloseHandle( h );
    34  
    35  	return ans==0xffffffff ? err : ans;
    36  }
    37  
    38  //--------------------------- 結んで開いて --------------------------//
    39  
    40  
    41  bool kiFile::open( const char* filename, bool read, bool create )
    42  {
    43  	close();
    44  
    45  	if( m_bReadMode = read )
    46  		m_hFile = ::CreateFile( filename,
    47  				GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
    48  				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
    49  	else
    50  		m_hFile = ::CreateFile( filename,
    51  				GENERIC_WRITE, FILE_SHARE_READ, NULL,
    52  				create ? CREATE_ALWAYS : OPEN_EXISTING,
    53  				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
    54  	if( m_hFile == INVALID_HANDLE_VALUE )
    55  		return false;
    56  
    57  	m_nBufPos = 0;
    58  	if( m_bReadMode )
    59  		flush();
    60  
    61  	return true;
    62  }
    63  
    64  void kiFile::close()
    65  {
    66  	if( m_hFile != INVALID_HANDLE_VALUE )
    67  	{
    68  		if( !m_bReadMode )
    69  			flush();
    70  
    71  		::CloseHandle( m_hFile );
    72  		m_hFile = INVALID_HANDLE_VALUE;
    73  	}
    74  }
    75  
    76  
    77  //-------------------------- 読み書き ----------------------------//
    78  
    79  
    80  unsigned long kiFile::read( unsigned char* buf, unsigned long len )
    81  {
    82  	unsigned long ans = 0;
    83  	if( m_nBufSize!=0 && m_hFile!=INVALID_HANDLE_VALUE && m_bReadMode )
    84  	{
    85  		while( (m_nBufSize-m_nBufPos) <= len )
    86  		{
    87  			ans += (m_nBufSize-m_nBufPos);
    88  			ki_memcpy( buf, m_pBuf+m_nBufPos, m_nBufSize-m_nBufPos );
    89  			len -= (m_nBufSize-m_nBufPos);
    90  			buf += (m_nBufSize-m_nBufPos);
    91  
    92  			flush();
    93  			if( m_nBufSize == 0 )
    94  				return ans;
    95  		}
    96  		ans += len;
    97  		ki_memcpy( buf, m_pBuf+m_nBufPos, len );
    98  		m_nBufPos += len;
    99  	}
   100  	return ans;
   101  }
   102  
   103  void kiFile::write( const void* buf, unsigned long len )
   104  {
   105  	if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode )
   106  		return;
   107  	const unsigned char* ubuf = (const unsigned char*)buf;
   108  
   109  	while( (kifile_bufsize-m_nBufPos) <= len )
   110  	{
   111  		ki_memcpy( m_pBuf+m_nBufPos, buf, (kifile_bufsize-m_nBufPos) );
   112  		len -= (kifile_bufsize-m_nBufPos);
   113  		ubuf += (kifile_bufsize-m_nBufPos);
   114  		m_nBufPos = kifile_bufsize;
   115  		flush();
   116  	}
   117  	ki_memcpy( m_pBuf+m_nBufPos, ubuf, len );
   118  	m_nBufPos += len;
   119  }
   120  
   121  #undef putc
   122  void kiFile::putc( unsigned char c )
   123  {
   124  	if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode )
   125  		return;
   126  	if( (kifile_bufsize-m_nBufPos) <= 1 )
   127  		flush();
   128  	m_pBuf[ m_nBufPos++ ] = c;
   129  }
   130  
   131  #undef getc
   132  int kiFile::getc()
   133  {
   134  	if( m_nBufSize==0 || m_hFile==INVALID_HANDLE_VALUE || !m_bReadMode )
   135  		return -1;
   136  
   137  	if( 0==(m_nBufSize-m_nBufPos) )
   138  	{
   139  		flush();
   140  		if( m_nBufSize==0 )
   141  			return -1;
   142  	}
   143  	if( 1==(m_nBufSize-m_nBufPos) )
   144  	{
   145  		int ans = m_pBuf[ m_nBufPos++ ];
   146  		flush();
   147  		return ans;
   148  	}
   149  
   150  	return m_pBuf[ m_nBufPos++ ];
   151  }
   152  
   153  void kiFile::flush()
   154  {
   155  	if( m_bReadMode )
   156  	{
   157  		::ReadFile( m_hFile, m_pBuf, kifile_bufsize, &m_nBufSize, NULL );
   158  		m_nBufPos = 0;
   159  	}
   160  	else
   161  	{
   162  		::WriteFile( m_hFile, m_pBuf, m_nBufPos, &m_nBufSize, NULL );
   163  		m_nBufSize = m_nBufPos = 0;
   164  	}
   165  }