Artifact Content

Not logged in

Artifact b12e88bb918155c85195e96582926226c115f44a


#include "stdafx.h"
#include "find.h"
using namespace ki;



//=========================================================================

namespace {
static inline bool isDots(const TCHAR* p)
{
	return (*p=='.' && (p[1]=='\0' || (p[1]=='.' && p[2]=='\0')));
}
}

bool FindFile::FindFirst( const TCHAR* wild, WIN32_FIND_DATA* pfd )
{
	HANDLE xh = ::FindFirstFile( wild, pfd );
	if( xh==INVALID_HANDLE_VALUE )
		return false;
	while( isDots(pfd->cFileName) )
		if( !::FindNextFile( xh, pfd ) )
		{
			::FindClose( xh );
			return false;
		}
	::FindClose( xh );
	return true;
}

void FindFile::Close()
{
	first_ = true;
	if( han_ != INVALID_HANDLE_VALUE )
		::FindClose( han_ ), han_ = INVALID_HANDLE_VALUE;
}

bool FindFile::Begin( const TCHAR* wild )
{
	Close();

	han_ = ::FindFirstFile( wild, &fd_ );
	if( han_ == INVALID_HANDLE_VALUE )
		return false;

	while( isDots(fd_.cFileName) )
		if( !::FindNextFile( han_, &fd_ ) )
		{
			Close();
			return false;
		}
	return true;
}

bool FindFile::Next( WIN32_FIND_DATA* pfd )
{
	if( han_ == INVALID_HANDLE_VALUE )
		return false;

	if( first_ )
	{
		first_ = false;
		memmove( pfd, &fd_, sizeof(fd_) );
		return true;
	}
	if( !::FindNextFile( han_, pfd ) )
		return false;
	while( isDots(fd_.cFileName) )
		if( !::FindNextFile( han_, pfd ) )
			return false;
	return true;
}

#undef isDots