dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "find.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: namespace { dcdd144598 2011-02-23 kinaba: static inline bool isDots(const TCHAR* p) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (*p=='.' && (p[1]=='\0' || (p[1]=='.' && p[2]=='\0'))); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool FindFile::FindFirst( const TCHAR* wild, WIN32_FIND_DATA* pfd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: HANDLE xh = ::FindFirstFile( wild, pfd ); dcdd144598 2011-02-23 kinaba: if( xh==INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: while( isDots(pfd->cFileName) ) dcdd144598 2011-02-23 kinaba: if( !::FindNextFile( xh, pfd ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ::FindClose( xh ); dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: ::FindClose( xh ); dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void FindFile::Close() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: first_ = true; dcdd144598 2011-02-23 kinaba: if( han_ != INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: ::FindClose( han_ ), han_ = INVALID_HANDLE_VALUE; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool FindFile::Begin( const TCHAR* wild ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Close(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: han_ = ::FindFirstFile( wild, &fd_ ); dcdd144598 2011-02-23 kinaba: if( han_ == INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: while( isDots(fd_.cFileName) ) dcdd144598 2011-02-23 kinaba: if( !::FindNextFile( han_, &fd_ ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Close(); dcdd144598 2011-02-23 kinaba: return false; 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: bool FindFile::Next( WIN32_FIND_DATA* pfd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( han_ == INVALID_HANDLE_VALUE ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( first_ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: first_ = false; dcdd144598 2011-02-23 kinaba: memmove( pfd, &fd_, sizeof(fd_) ); dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: if( !::FindNextFile( han_, pfd ) ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: while( isDots(fd_.cFileName) ) dcdd144598 2011-02-23 kinaba: if( !::FindNextFile( han_, pfd ) ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #undef isDots