144 lines
3.5 KiB
C++
144 lines
3.5 KiB
C++
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include "../../include/toolkit/XDirectoryScanner.h"
|
|
#include "../../include/toolkit/XFileUtil.h"
|
|
#include "../../include/toolkit/XStringUtil.h"
|
|
#include "../../include/toolkit/safe_function.h"
|
|
|
|
|
|
struct Win32Scanner : IDirectoryScanner
|
|
{
|
|
bool Scan( const char *szDirectory, Scanner *pScanner, const char* szFilter );
|
|
};
|
|
|
|
bool Win32Scanner::Scan( const char *szDirectory, Scanner *pScanner, const char* szFilter )
|
|
{
|
|
struct _Scanner : Scanner
|
|
{
|
|
_Scanner( Scanner * _p ) : p( _p ) {}
|
|
|
|
bool onDirectory( const char *szFullPath, const char *szDirectory, const char *szFileName )
|
|
{
|
|
return p->onDirectory( szFullPath, szDirectory, szFileName );
|
|
}
|
|
|
|
bool onFile( const char *szFullPath, const char *szDirectory, const char *szFileName )
|
|
{
|
|
return p->onFile( szFullPath, szDirectory, szFileName );
|
|
}
|
|
|
|
Scanner * p;
|
|
|
|
} _scanner( pScanner );
|
|
|
|
WIN32_FIND_DATA FileData;
|
|
HANDLE hSearch;
|
|
|
|
std::string strCurrentDirectory = szDirectory;
|
|
XFileUtil::NomalizeDirectoryName( strCurrentDirectory );
|
|
|
|
if( szFilter == NULL )
|
|
{
|
|
szFilter = "*";
|
|
}
|
|
|
|
hSearch = FindFirstFile( ( strCurrentDirectory + szFilter ).c_str() , &FileData);
|
|
if (hSearch == INVALID_HANDLE_VALUE)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
std::string strFullPath;
|
|
while ( true )
|
|
{
|
|
if( strcmp( FileData.cFileName, "." ) &&
|
|
strcmp( FileData.cFileName, ".." ) )
|
|
{
|
|
size_t len = strlen( FileData.cFileName );
|
|
for( size_t idx = 0; idx < len; ++idx ) if( FileData.cFileName[idx] == '/' ) FileData.cFileName[idx] = '\\';
|
|
|
|
strFullPath = strCurrentDirectory;
|
|
strFullPath += FileData.cFileName;
|
|
|
|
if( XFileUtil::IsDirectory( strFullPath.c_str() ) )
|
|
{
|
|
|
|
strFullPath += "\\";
|
|
if( !pScanner->onDirectory( strFullPath.c_str(), strCurrentDirectory.c_str(), FileData.cFileName ) ) break;
|
|
Scan( strFullPath.c_str(), &_scanner, szFilter );
|
|
}
|
|
else
|
|
{
|
|
if( !pScanner->onFile( strFullPath.c_str(), strCurrentDirectory.c_str(), FileData.cFileName ) ) break;
|
|
}
|
|
}
|
|
|
|
if (!FindNextFile(hSearch, &FileData))
|
|
{
|
|
if (GetLastError() == ERROR_NO_MORE_FILES)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
FindClose(hSearch);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool IDirectoryScanner::EnumFiles( const char *szDirectory, std::vector< std::string > * pvList )
|
|
{
|
|
struct _Scanner : Scanner
|
|
{
|
|
virtual bool onDirectory( const char *szFullPath, const char *szDirectory, const char *szFileName ) { return true; }
|
|
virtual bool onFile( const char *szFullPath, const char *szDirectory, const char *szFileName ) { pList->push_back( szFullPath ); return true; }
|
|
std::vector< std::string > * pList;
|
|
};
|
|
|
|
_Scanner temp;
|
|
temp.pList = pvList;
|
|
|
|
return Scan( szDirectory, &temp );
|
|
}
|
|
|
|
bool IDirectoryScanner::EnumFiles( const char *szDirectory, const char *szWildCard, std::vector< std::string > * vList )
|
|
{
|
|
struct _Scanner : Scanner
|
|
{
|
|
virtual bool onDirectory( const char *szFullPath, const char *szDirectory, const char *szFileName ) { return true; }
|
|
|
|
virtual bool onFile( const char *szFullPath, const char *szDirectory, const char *szFileName )
|
|
{
|
|
if( XStringUtil::WildCardCmp( szWildCard, szFileName, true ) )
|
|
{
|
|
pList->push_back( szFullPath );
|
|
}
|
|
return true;
|
|
}
|
|
const char *szWildCard;
|
|
std::vector< std::string > * pList;
|
|
};
|
|
|
|
_Scanner temp;
|
|
temp.szWildCard = szWildCard;
|
|
temp.pList = vList;
|
|
|
|
return Scan( szDirectory, &temp );
|
|
}
|
|
|
|
IDirectoryScanner & IDirectoryScanner::Instance()
|
|
{
|
|
static Win32Scanner _scanner;
|
|
return _scanner;
|
|
}
|
|
|