Я не знаю, есть ли лучший способ, но я использую FindFirstFile / FindNextFile для этого (некоторая проверка ошибок удалена для ясности):
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
_TCHAR szDir[] = _T("somedir\\*");
hFind = FindFirstFile(szDir, &ffd);
do
{
if((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && !(!_tcscmp(ffd.cFileName,_T(".")) || !_tcscmp(ffd.cFileName, _T(".."))))
{
// This is a directory
}
}
while (FindNextFile(hFind, &ffd) != 0);