非遞歸方式遍歷目錄及其子目錄的文件

字號:

在編程設計開發(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);
     }
     }