在編程設計開發(fā)中,搜索一個目錄及其子目錄下所有的文件是比較常見的需求,而采用遞歸方式進行搜索則是一個非常直觀的算法。但是,由于目錄中文件數量往往比較大,而每個文件名又往往占用許多空間,目錄嵌套比較深的情況下,這種遞歸算法對于程序的堆棧是一個嚴重的威脅。本文給出一種非遞歸的算法進行目錄下所有文件的檢索和遍歷。
typedef BOOL (*PROCESS_FILE_FUNCTION)(LPCTSTR filename);
上面的PROCESS_FILE_FUNCTION是一種函數指針,這個函數處理文件名為filename的文件,如果該函數返回
FALSE,則ProcessDirectory立刻退出,不再繼續(xù)查找
void ProcessDirectory(LPCTSTR dirname,PROCESS_FILE_FUNCTION proc)
{
CStringArray dirs;
CString searchname;
CFileFind find;
dirs.Add(dirname);
BOOL bRet;
while(dirs.GetSize()>0)
{
searchname = dirs[0] +\"\\\\*.*\";
dirs.RemoveAt(0);
bRet = find.FindFile (searchname,0);
if(!bRet)continue;
do{
bRet = find.FindNextFile ();
if(find.IsDots ())
{//忽略.和..文件
continue;
}
if(find.IsDirectory ())
{
dirs.Add (find.GetFilePath());
continue;
}else{
if(!proc(find.GetFilePath ()))
{
return;
}
}
}while(bRet);
}
}
typedef BOOL (*PROCESS_FILE_FUNCTION)(LPCTSTR filename);
上面的PROCESS_FILE_FUNCTION是一種函數指針,這個函數處理文件名為filename的文件,如果該函數返回
FALSE,則ProcessDirectory立刻退出,不再繼續(xù)查找
void ProcessDirectory(LPCTSTR dirname,PROCESS_FILE_FUNCTION proc)
{
CStringArray dirs;
CString searchname;
CFileFind find;
dirs.Add(dirname);
BOOL bRet;
while(dirs.GetSize()>0)
{
searchname = dirs[0] +\"\\\\*.*\";
dirs.RemoveAt(0);
bRet = find.FindFile (searchname,0);
if(!bRet)continue;
do{
bRet = find.FindNextFile ();
if(find.IsDots ())
{//忽略.和..文件
continue;
}
if(find.IsDirectory ())
{
dirs.Add (find.GetFilePath());
continue;
}else{
if(!proc(find.GetFilePath ()))
{
return;
}
}
}while(bRet);
}
}