在上一篇文章中。通过用递归的方法实现了遍历文件目录。递归虽然看起来清晰,代码也少。但是觉得太难理解了。特别是对于俺这种菜鸟。所以通过找资料,重新修改了代码。非递归的方式来实现遍历文件目录。代码如下。(该代码在Vc6.0下测试通过)
void FindFile(LPTSTR strPath, LPTSTR strFile)
{
TCHAR strRoot[MAX_PATH];
TCHAR strSearchFile[MAX_PATH];
TCHAR strOut[MAX_PATH];
WIN32_FIND_DATA fData;
LPTSTR strTemp[MAX_PATH];
int iCount = 0;
ZeroMemory(strOut, sizeof(strOut));
ZeroMemory(&fData, sizeof(WIN32_FIND_DATA));
dirQueue.push(strPath);
while(!dirQueue.empty())
{
lstrcpy(strRoot, dirQueue.front());
lstrcpy(strSearchFile, dirQueue.front());
lstrcat(strSearchFile, _T("*.*"));
dirQueue.pop();
HANDLE hFile = FindFirstFile(strSearchFile, &fData);
do
{
if(fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
&& lstrcmp(fData.cFileName, _T("."))
&& lstrcmp(fData.cFileName, _T("..")))
{
strTemp[iCount] = new TCHAR[MAX_PATH]; //这个地方要注意,不能用同一个内存块重复用,否则.....
lstrcpy(strTemp[iCount], strRoot);
lstrcat(strTemp[iCount], fData.cFileName);
lstrcat(strTemp[iCount], _T("\\"));
dirQueue.push(strTemp[iCount]);
iCount++;
continue;
}
if(lstrcmp(fData.cFileName, _T("."))
&& lstrcmp(fData.cFileName, _T("..")))
{
lstrcpy(strOut, strRoot);
lstrcat(strOut, fData.cFileName);
ListBox_AddString(m_hWnd, strOut);
ZeroMemory(strOut, sizeof(strOut));
}
}while(FindNextFile(hFile, &fData) != 0);
}
for(int i = 0; i < iCount; i++)
delete [] strTemp[i];
}