路径下文件遍历

自己总结了磁盘路径下的文件遍历供大家分享,遍历有深度和广度之分,而,对于路径较长的遍历,无疑广度是最佳选择,深度遍历的递归性消耗大量的资源占用。而广度则为优选。

深度递归遍历为在指定路径下,加上\*进行遍历,遇到文件夹后,则进入文件夹内进行新的遍历,直到文件夹下全是文件,各种递归,完成。

广度遍历则是在遍历指定路径下文件后,进行遍历遇到文件夹进行压栈,然后继续循环在本文件夹下完成后,再从栈中取出文件夹进行层层遍历,最后,完成。

主要的函数,数据结构: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);

}



转自:http://my.oschina.net/u/1027869/blog/121802
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值