This code is taken from a utility for counting lines in all files matching a given spec, in or below a certain folder. It illustrates the technique for recursing into folders quite well. It's pretty obvious, you just have to watch out for the special case items . (this folder) and .. (up one).
UINT CCountlinesDlg::GetLineCountForFiles (CString& csStartFolder,
CString& csFileSpec,
BOOL bRecurse)
{
UINT uRetVal = 0;
HANDLE hFF = 0;
WIN32_FIND_DATA wfd;
int iDotIndex=0;
CString csPath;
CString csFile;
CString csSubPath;
CString csTgt;
CString csExtension;
CString csUpperFileSpec = csFileSpec;
csUpperFileSpec.MakeUpper();
m_csOutputDir = csStartFolder;
UpdateData (FALSE);
csTgt = csStartFolder + "\\*.*";
hFF = FindFirstFile (csTgt,&wfd);
if (hFF != INVALID_HANDLE_VALUE)
{
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp (wfd.cFileName, ".") &&
strcmp (wfd.cFileName, "..") &&
bRecurse)
{
// recurse into the subdir:
csSubPath = csStartFolder + "\\" + wfd.cFileName;
uRetVal += GetLineCountForFiles (csSubPath,csFileSpec,bRecurse);
}
}
else
{
// Is this one of the target files ?
csFile = wfd.cFileName;
iDotIndex = csFile.ReverseFind ('.');
csExtension = csFile.Right (csFile.GetLength() - (iDotIndex+1));
csExtension.MakeUpper ();
if (csExtension == csUpperFileSpec)
{
csFile = csStartFolder + "\\" + wfd.cFileName;
uRetVal += CountLinesIn (csFile);
m_csOutputFile.Format ("%s : %u", wfd.cFileName, uRetVal);
UpdateData (FALSE);
}
}
while (FindNextFile (hFF, &wfd))
{
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp (wfd.cFileName, ".") &&
strcmp (wfd.cFileName, "..") &&
bRecurse)
{
// recurse into the subdir:
csSubPath = csStartFolder + "\\" + wfd.cFileName;
uRetVal += GetLineCountForFiles (csSubPath,csFileSpec,bRecurse);
}
}
else
{
// Is this one of the target files?
csFile = wfd.cFileName;
iDotIndex = csFile.ReverseFind ('.');
csExtension = csFile.Right (csFile.GetLength() - (iDotIndex+1));
csExtension.MakeUpper();
if (csExtension == csUpperFileSpec)
{
csFile = csStartFolder + "\\" + wfd.cFileName;
uRetVal += CountLinesIn (csFile);
m_csOutputFile.Format ("%s : %u", wfd.cFileName, uRetVal);
UpdateData (FALSE);
}
}
}
}
return uRetVal;
}