如何递归遍历磁盘文件

遍历磁盘文件的API为FindFirstFile和FindNextFile
其原型如下:

//INVALID_HANDLE_VALUE 表示失败
HANDLE FindFirstFile(
  LPCTSTR lpFileName,      //文件路径
  LPWIN32_FIND_DATA lpFindFileData  //文件信息结构
);
//返回非0表示成功,0表示失败
BOOL FindNextFile( 
  HANDLE hFindFile,   //FindFirstFile返回的文件句柄
  LPWIN32_FIND_DATA lpFindFileData //文件信息结构
);

代码如下:

BOOL SearchFile(TCHAR* szPath)
{
    WIN32_FIND_DATA windata = { 0 };            //文件信息结构
    HANDLE hFile = NULL;
    TCHAR szPathNext[MAX_PATH];                 //存放下一级目录路径
    ZeroMemory(szPathNext, sizeof(szPathNext));
    sprintf(szPathNext, "%s//*.*", szPath);     //递归的时候继续深入下一级目录查找文件 
    hFile = FindFirstFile(szPathNext, &windata);//查找第一个文件(夹)
    if (hFile == INVALID_HANDLE_VALUE)
        return FALSE;
    do 
    {
        if(windata.cFileName[0] == '.')         //如果是当前目录或者上级目录,则进入下一次循环
            continue;
        if (windata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //判断是否是文件夹
        {
            sprintf(szPathNext, "%s//%s", szPath, windata.cFileName); 
            SearchFile(szPathNext); //递归查找
        } 
        else
        {   
            printf("%s//%s\n", szPath, windata.cFileName);//如果是文件则输出文件路径
        }

    } while (FindNextFile(hFile,&windata));     //如果深入到最后一层没有文件了则以次退出到上一层目录
    FindClose(hFile);
    return TRUE;
}

例如:
SearchFile(“C:\temp”);

其结果如图:
如何递归遍历磁盘文件_第1张图片

需要注意的是如果用TCHAR类型,最好把字符集设为未设置,否则遇到中文路径会出错的.

你可能感兴趣的:(递归,api,遍历,磁盘)