路径下文件遍历

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

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

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

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

}

}

广度遍历:

  1. 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);
    
    
    
    }

你可能感兴趣的:(路径下文件遍历)