13b7203622 2011-02-23 kinaba: //--- K.I.LIB --- 13b7203622 2011-02-23 kinaba: // kl_find.h : FindFirstFile wrapper 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: #define isDots(p) (*p=='.' && (p[1]=='\0' || (p[1]=='.' && p[2]=='\0'))) 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiFindFile::findfirst( const char* wild, WIN32_FIND_DATA* pfd ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: HANDLE xh = ::FindFirstFile( wild, pfd ); 13b7203622 2011-02-23 kinaba: if( xh==INVALID_HANDLE_VALUE ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: while( isDots(pfd->cFileName) ) 13b7203622 2011-02-23 kinaba: if( !::FindNextFile( xh, pfd ) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ::FindClose( xh ); 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: ::FindClose( xh ); 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiFindFile::close() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: first=true; 13b7203622 2011-02-23 kinaba: if( h!=INVALID_HANDLE_VALUE ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ::FindClose( h ), h=INVALID_HANDLE_VALUE; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiFindFile::begin( const char* wild ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: close(); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: h = ::FindFirstFile( wild, &fd ); 13b7203622 2011-02-23 kinaba: if( h==INVALID_HANDLE_VALUE ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: while( isDots(fd.cFileName) ) 13b7203622 2011-02-23 kinaba: if( !::FindNextFile( h, &fd ) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: close(); 13b7203622 2011-02-23 kinaba: return false; 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: bool kiFindFile::next( WIN32_FIND_DATA* pfd ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( h==INVALID_HANDLE_VALUE ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: if( first ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: first = false; 13b7203622 2011-02-23 kinaba: ki_memcpy( pfd, &fd, sizeof(fd) ); 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: if( !::FindNextFile( h, pfd ) ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: while( isDots(fd.cFileName) ) 13b7203622 2011-02-23 kinaba: if( !::FindNextFile( h, pfd ) ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: #undef isDots