源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

  • 时间:2020-12-05 14:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例
1:非递归方法:
[u]复制代码[/u] 代码如下:
// File Name: CSearch.h #pragma once #include <vector> #include <atlstr.h> #include <stack> class Search { private:     std::vector<CString> m_strPath;        // 保存查找到了文件路径     std::vector<CString> m_strSearchName;    // 搜索的关键字     std::stack<CString> strPathStack;            // 栈,保存磁盘ID     void ListAllFileInDrectory(CString strPath); public:     Search();     ~Search();     void Start(void);                    // 开始搜索 };
[u]复制代码[/u] 代码如下:
// File Name: CSearch.cpp #include "stdafx.h" #include "CSearch.h" #include <Shlobj.h> #pragma comment(lib, "Shell32.lib") #include <locale.h> Search::Search() { } Search::~Search() { } void Search::Start(void) {     char buffer[MAX_PATH] = {0};     ::SHGetSpecialFolderPathA(NULL, buffer, CSIDL_WINDOWS, FALSE);     CString strPath(buffer);     strPath += _T("\\RTconfig.ini");      if (!PathFileExists(strPath))      {          if (PathFileExists(_T("RTconfig.ini")))          {              MoveFile(_T("RTconfig.ini"), strPath);          }          else          {              return;          }      }     CStdioFile file;     if (file.Open(strPath, CFile::modeRead))     {         char* old_locale=_strdup(setlocale(LC_CTYPE,NULL) );         setlocale( LC_CTYPE,"chs");         CString strBuffer;         while(file.ReadString(strBuffer))         {             m_strSearchName.push_back(strBuffer);         }         setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置         free( old_locale );//还原区域设定         file.Close();     }     TCHAR strBuffer[50] = {0};     TCHAR * pStr = strBuffer;     CString strTempName;     // 获取磁盘驱动器     GetLogicalDriveStrings(50, strBuffer);     strTempName = strBuffer;     while (strTempName != _T(""))     {         // 如果是磁盘号         if (DRIVE_FIXED == GetDriveType(strTempName))         {             strPathStack.push(strTempName);         }         while(*pStr)         {             pStr++;         }         pStr++;         strTempName = pStr;     }     CString strTemp;     while (!strPathStack.empty())     {             strTemp = strPathStack.top();             strPathStack.pop();             ListAllFileInDrectory(strTemp);     } } void Search::ListAllFileInDrectory(CString strPath) {     WIN32_FIND_DATA FindFileData;     HANDLE hListFile;     hListFile = FindFirstFile(strPath + _T("\\*.*"), &FindFileData);     if (hListFile == INVALID_HANDLE_VALUE)     {         //"错误码:" GetLastError()     }     else     {         do         {             // 过滤"."和".."             CString strTemp(FindFileData.cFileName);             if (strTemp == _T(".") || strTemp == _T(".."))             {                 continue;             }             strTemp = FindFileData.cFileName;             strTemp.MakeLower();             if (-1 != strTemp.Find(_T(".txt")) || -1 != strTemp.Find(_T(".doc")) || -1 != strTemp.Find(_T(".docx")))             {                 std::vector<CString>::iterator iter;                 for (iter = m_strSearchName.begin(); iter != m_strSearchName.end(); iter++)                 {                     if (-1 != strTemp.Find((*iter).MakeLower()))                     {                         m_strPath.push_back(strPath + _T("\\") + FindFileData.cFileName);                         break;        // 跳出循环                     }                 }             }             // 如果是目录 且不是系统属性目录 压栈             if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))             {                     strPathStack.push(strPath + _T("\\") + FindFileData.cFileName);             }         }         while(FindNextFile(hListFile, &FindFileData));     }     FindClose(hListFile);            // 关闭句柄,不然造成内存溢出 }
2:递归方法
[u]复制代码[/u] 代码如下:
// File Name: CSearch.h #pragma once #include <vector> #include <atlstr.h> #include <stack> class Search { private:     std::vector<CString> m_strPath;        // 保存查找到了文件路径     std::vector<CString> m_strSearchName;    // 搜索的关键字     void ListAllFileInDrectory(CString strPath); public:     Search();     ~Search();     void Start(void);                    // 开始搜索 };
[u]复制代码[/u] 代码如下:
// File Name: CSearch.cpp #include "stdafx.h" #include "CSearch.h" #include <Shlobj.h> #pragma comment(lib, "Shell32.lib") #include <locale.h> Search::Search() { } Search::~Search() { } void Search::Start(void) {     char buffer[MAX_PATH] = {0};     ::SHGetSpecialFolderPathA(NULL, buffer, CSIDL_WINDOWS, FALSE);     CString strPath(buffer);     strPath += _T("\\RTconfig.ini");      if (!PathFileExists(strPath))      {          if (PathFileExists(_T("RTconfig.ini")))          {              MoveFile(_T("RTconfig.ini"), strPath);          }          else          {              return;          }      }     CStdioFile file;     if (file.Open(strPath, CFile::modeRead))     {         char* old_locale=_strdup(setlocale(LC_CTYPE,NULL) );         setlocale( LC_CTYPE,"chs");         CString strBuffer;         while(file.ReadString(strBuffer))         {             m_strSearchName.push_back(strBuffer);         }         setlocale( LC_CTYPE, old_locale ); //还原语言区域的设置         free( old_locale );//还原区域设定         file.Close();     }     TCHAR strBuffer[50] = {0};     TCHAR * pStr = strBuffer;     CString strTempName;     // 获取磁盘驱动器     GetLogicalDriveStrings(50, strBuffer);     strTempName = strBuffer;     while (strTempName != _T(""))     {         // 如果是磁盘号         if (DRIVE_FIXED == GetDriveType(strTempName))         {             ListAllFileInDrectory(strTempName);         }         while(*pStr)         {             pStr++;         }         pStr++;         strTempName = pStr;     } } void Search::ListAllFileInDrectory(CString strPath) {     WIN32_FIND_DATA FindFileData;     HANDLE hListFile;     hListFile = FindFirstFile(strPath + _T("\\*.*"), &FindFileData);     if (hListFile == INVALID_HANDLE_VALUE)     {         //"错误码:" GetLastError()     }     else     {         do         {             // 过滤"."和".."             CString strTemp(FindFileData.cFileName);             if (strTemp == _T(".") || strTemp == _T(".."))             {                 continue;             }             strTemp = FindFileData.cFileName;             strTemp.MakeLower();             if (-1 != strTemp.Find(_T(".txt")) || -1 != strTemp.Find(_T(".doc")) || -1 != strTemp.Find(_T(".docx")))             {                 std::vector<CString>::iterator iter;                 for (iter = m_strSearchName.begin(); iter != m_strSearchName.end(); iter++)                 {                     if (-1 != strTemp.Find((*iter).MakeLower()))                     {                         m_strPath.push_back(strPath + _T("\\") + FindFileData.cFileName);                         break;        // 跳出循环                     }                 }             }             // 如果是目录 且不是系统属性目录 递归调用             if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))             {                     ListAllFileInDrectory(strPath + _T("\\") + FindFileData.cFileName);             }         }         while(FindNextFile(hListFile, &FindFileData));     }     FindClose(hListFile);            // 关闭句柄,不然造成内存溢出 }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部