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: }