自己总结了磁盘路径下的文件遍历供大家分享,遍历有深度和广度之分,而,对于路径较长的遍历,无疑广度是最佳选择,深度遍历的递归性消耗大量的资源占用。而广度则为优选。
深度递归遍历为在指定路径下,加上\*进行遍历,遇到文件夹后,则进入文件夹内进行新的遍历,直到文件夹下全是文件,各种递归,完成。
广度遍历则是在遍历指定路径下文件后,进行遍历遇到文件夹进行压栈,然后继续循环在本文件夹下完成后,再从栈中取出文件夹进行层层遍历,最后,完成。
主要的函数,数据结构:WIN32_FIND_DATA ,FindFirstFile(), FindNextFile();
递归遍历:
void MyFindFile(const char *pFileName, char* pext = ".*")
{
char szFile[MAX_PATH*100];
char szTmp[MAX_PATH];
char szPath[MAX_PATH*100];
WIN32_FIND_DATA find_data;
strcpy(szPath,pFileName);
strcpy(szFile,szPath);
strcat(szFile,"\\*");
strcat(szFile, pext);
//C:\Documents and Settings\Administrator\◊¿√Ê\machfe\*.txt
HANDLE hHandle = FindFirstFile(szFile, &find_data);
if(hHandle!= NULL )
{
do{
if(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if(find_data.cFileName[0] != '.')
{
strcpy(szTmp,szPath);
strcat(szTmp,"\\");
strcat(szTmp, find_data.cFileName);
//Sleep(100);
MyFindFile(szTmp);
}
}
else
{
printf("%s//%s\n", szPath, find_data.cFileName);
//Sleep(100);
}
}while(FindNextFile(hHandle,&find_data) );
FindClose(hHandle);
}
}
广度遍历:
void BreathFindFile(const char *pFileName, char* pext = ".*")
{
char szFile[MAX_PATH];
char szTmp[MAX_PATH];
char szPath[MAX_PATH]; //µ±«∞…®√Ë∏˘¬∑æ∂
CStringList strStact;
WIN32_FIND_DATA find_data;
strcpy(szPath,pFileName);
do{
strcpy(szFile,szPath);
strcat(szFile,"\\*");
strcat(szFile, pext);
HANDLE hHandle = FindFirstFile(szFile, &find_data);
if(hHandle!= NULL )
{
do{
if(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if(find_data.cFileName[0] != '.')
{
strcpy(szTmp,szPath);
strcat(szTmp,"\\");
strcat(szTmp, find_data.cFileName);
strStact.AddTail(szTmp);
}
}
else
{
printf("%s//%s\n", szPath, find_data.cFileName);
}
}while(FindNextFile(hHandle,&find_data) );
FindClose(hHandle);
}
if( strStact.IsEmpty() )
{
break;
}
else
{
CString strTmp = strStact.GetTail();
strStact.RemoveTail();
strcpy(szPath, strTmp.GetBuffer(0));
strTmp.ReleaseBuffer();
}
}while (TRUE);
}