Windows下遍历文件目录

来源:互联网 发布:阿莱克丝塔萨 知乎 编辑:程序博客网 时间:2024/05/18 15:50

最近用到遍历文件目录,总结一下:

#include <Windows.h>WIN32_FIND_DATA fndData;HANDLE hFnd = INVALID_HANDLE_VALUE;hFnd = ::FindFirstFile(_T("D:\\Program Files\\*.*"), &fndData);if (hFnd == INVALID_HANDLE_VALUE){    return ;}while (::FindNextFile(&fndData)){    CString strFileName = fndData.cFileName;    if (fndData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    {// 目录    }    else    {// 文件    }}if (::GetLastError() == 18){    // 目录下的文件检索完毕.}::FindClose(hFnd);


我们可以通过一个递归函数来递归遍历:

void BuildRegSystem(    const tstring& strFileSystemPath,    const tstring& strAddParPath,    CSysMgr& mgr    ){    tstring strFsPath = strFileSystemPath;    tstring strEnumPath = strFileSystemPath;    tstring strAddNewPath = strAddParPath;    if (*strFsPath.rbegin() != _T('\\'))    {        strFsPath += _T('\\');    }    if (*strAddNewPath.rbegin() != _T('\\'))    {        strAddNewPath += _T('\\');    }    strEnumPath = strFsPath + _T("*.*");    WIN32_FIND_DATA fndFile;    HANDLE hFnd = ::FindFirstFile(strEnumPath.c_str(), &fndFile);    if (hFnd == INVALID_HANDLE_VALUE)    {        return ;    }    while (::FindNextFile(hFnd, &fndFile))    {        tstring strFileName = fndFile.cFileName;        if (strFileName == _T(".."))        {// 如果是上级目录,则不管.            continue;        }        if (fndFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)        {            // 如果是文件夹,则进行递归.            mgr.CreateRegDirectory(strAddNewPath + strFileName);            BuildRegSystem(                strFsPath + strFileName,                strAddNewPath + strFileName,                regSystem                );        }        else        {            mgr.InsertEntry(strAddParPath, strFileName);        }    }    ::FindClose(hFnd);}void Test(){    CSysMgr mgr;    BuildRegSystem(_T("D:\\Program Files\\11game"), _T("\\"), mgr);        // ...    // ...}

没有任何复杂的操作,只为备忘。






原创粉丝点击