开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

一个C++类实现文件全盘搜索

简介:
+关注继续查看
VC++实现文件全盘搜索
很久没更新了,今天决定写点东西。
这是我以前写的一个C++的类,可以在硬盘上全盘搜索指定的文件(可以用通配符),还可以添加过滤器,以便搜索特定的文件。该类使用链表储存搜索结果(学了那么多数据结构,总算可以用一把了),性能还是可以的。虽说没什么技术含量,但也挺有用的
下面就是这个类的代码,包括测试程序,原本我没有写注释,现在加上了一些。
这个博客居然不支持C++的代码插入,只好用C#的来将就一下了.

  #include <windows.h> 
InBlock.gif#include <shlwapi.h> 
InBlock.gif#include <iostream> 
InBlock.gif 
InBlock.gif#pragma comment(lib,"shlwapi.lib"
InBlock.gif 
InBlock.gifusing namespace std; 
InBlock.gif 
InBlock.gif//定义过滤器的最大数量 
InBlock.gif#define CONST_MAX_FILTER 16 
InBlock.gif//链表的数据结构 
InBlock.giftypedef struct tagList{ 
InBlock.gif  TCHAR szFile[MAX_PATH]; 
InBlock.gif  struct tagList *NextFile; 
InBlock.gif}FileList, *PFileList; 
InBlock.gif//主体类 
InBlock.gifclass CHunter{ 
InBlock.gifpublic
InBlock.gif  CHunter(); 
InBlock.gif  ~CHunter(); 
InBlock.gif 
InBlock.gif  void AddFilter( TCHAR *szFilter );//添加过滤器 
InBlock.gif  void CHunter::Hunt( TCHAR *szPath ); 
InBlock.gif  TCHAR *GetFile();//取得链表中的文件 
InBlock.gif  DWORD    GetFileCount();//取得文件的数量 
InBlock.gif 
InBlock.gifprivate
InBlock.gif  PFileList headNode;//链表头 
InBlock.gif  PFileList currNode; 
InBlock.gif 
InBlock.gif  void AddFile( TCHAR *szFile ); 
InBlock.gif  void HuntFile( char *lpPath ) ; 
InBlock.gif 
InBlock.gif  TCHAR    szFilter[CONST_MAX_FILTER][5] ; 
InBlock.gif  DWORD    dwFilterCount ; 
InBlock.gif  DWORD    dwFileCount ; 
InBlock.gif}; 
InBlock.gif 
InBlock.gifCHunter::CHunter():dwFilterCount(0),dwFileCount(0) 
InBlock.gif
InBlock.gif  headNode = (FileList *)malloc( sizeof(FileList) ); 
InBlock.gif  headNode->NextFile = NULL; 
InBlock.gif  currNode = headNode; 
InBlock.gif  for(int i=0; i< CONST_MAX_FILTER; i++) 
InBlock.gif    ZeroMemory( szFilter[i], 5 ) ; 
InBlock.gif
InBlock.gif 
InBlock.gifCHunter::~CHunter() 
InBlock.gif
InBlock.gif  PFileList next, tmp; 
InBlock.gif  tmp = headNode; 
InBlock.gif 
InBlock.gif  while( tmp->NextFile != NULL ) 
InBlock.gif  { 
InBlock.gif    next = tmp->NextFile ; 
InBlock.gif    free(tmp); 
InBlock.gif    tmp = next; 
InBlock.gif  } 
InBlock.gif  free(tmp); 
InBlock.gif
InBlock.gif 
InBlock.gif//添加过滤器,比如.txt,为了简省,没有考虑文件扩展名长度大于4的情况 
InBlock.gif//请自行修改 
InBlock.gifvoid CHunter::AddFilter( TCHAR *szInp ) 
InBlock.gif
InBlock.gif  if( strlen(szInp) > 4 ) 
InBlock.gif    return
InBlock.gif  strncpy( szFilter[dwFilterCount++], szInp, 5 ); 
InBlock.gif
InBlock.gif 
InBlock.gifvoid CHunter::AddFile( TCHAR *szFile ) 
InBlock.gif
InBlock.gif  currNode->NextFile = (FileList *)malloc( sizeof(FileList) ); 
InBlock.gif  currNode = currNode->NextFile;    
InBlock.gif  ZeroMemory(currNode->szFile, MAX_PATH ); 
InBlock.gif  currNode->NextFile = NULL ; 
InBlock.gif  strncpy( currNode->szFile, szFile, MAX_PATH ); 
InBlock.gif  dwFileCount++; 
InBlock.gif
InBlock.gif 
InBlock.gif//这是入口函数,调用它即可开始搜索,这个路径的尾部不应有反斜杠 
InBlock.gifvoid CHunter::Hunt( TCHAR *szPath ) 
InBlock.gif
InBlock.gif  HuntFile( szPath ); 
InBlock.gif  currNode = headNode->NextFile; 
InBlock.gif
InBlock.gif 
InBlock.gifDWORD CHunter::GetFileCount() 
InBlock.gif
InBlock.gif  return this->dwFileCount; 
InBlock.gif
InBlock.gif 
InBlock.gif//这个函数依次遍历链表中的文件,并返回一个文件名 
InBlock.gifTCHAR *CHunter::GetFile() 
InBlock.gif
InBlock.gif  TCHAR *szRet; 
InBlock.gif  szRet = currNode->szFile; 
InBlock.gif  currNode = currNode->NextFile; 
InBlock.gif 
InBlock.gif  return szRet; 
InBlock.gif
InBlock.gif 
InBlock.gifvoid CHunter::HuntFile(char * lpPath) 
InBlock.gif
InBlock.gif        char szFind[MAX_PATH]; 
InBlock.gif  char szFile[MAX_PATH]; 
InBlock.gif        WIN32_FIND_DATA FindFileData; 
InBlock.gif 
InBlock.gif  ZeroMemory(szFind,MAX_PATH); 
InBlock.gif        ZeroMemory(szFile,MAX_PATH); 
InBlock.gif  strcpy(szFind,lpPath); 
InBlock.gif        strcat(szFind,"\\*.*"); 
InBlock.gif 
InBlock.gif        HANDLE hFind=::FindFirstFile(szFind,&FindFileData); 
InBlock.gif        if(INVALID_HANDLE_VALUE == hFind)        return
InBlock.gif         
InBlock.gif        while(TRUE) 
InBlock.gif        { 
InBlock.gif                if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
InBlock.gif                { 
InBlock.gif                        if(FindFileData.cFileName[0]!='.') 
InBlock.gif                        { 
InBlock.gif                                strcpy(szFile,lpPath); 
InBlock.gif                                strcat(szFile,"\\"); 
InBlock.gif                                strcat(szFile,FindFileData.cFileName); 
InBlock.gif                                HuntFile(szFile); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif                else 
InBlock.gif                { 
InBlock.gif      strcpy(szFile,lpPath); 
InBlock.gif                        strcat(szFile,"\\"); 
InBlock.gif      strcat(szFile,FindFileData.cFileName); 
InBlock.gif                        //cout << szFile << FindFileData.cFileName << endl; 
InBlock.gif      forint i=0; i< dwFilterCount; i++ ) 
InBlock.gif        if( strncmp(szFilter[i], PathFindExtension(szFile), 5) == 0 ) 
InBlock.gif          this->AddFile( szFile ); 
InBlock.gif                } 
InBlock.gif                if(!FindNextFile(hFind,&FindFileData))        break
InBlock.gif        } 
InBlock.gif        FindClose(hFind); 
InBlock.gif
InBlock.gif 
InBlock.gif//示例,搜索D盘所有的exe文件 
InBlock.gifint main(int argc, char* argv[]) 
InBlock.gif
InBlock.gif        CHunter hunter; 
InBlock.gif  hunter.AddFilter(".exe"); 
InBlock.gif  hunter.Hunt("D:"); 
InBlock.gif 
InBlock.gif  cout<< hunter.GetFileCount() << endl; 
InBlock.gif  for(int i=0; i< hunter.GetFileCount(); i++) 
InBlock.gif    cout<< hunter.GetFile() << endl; 
InBlock.gif  return 0; 
InBlock.gif









本文转自 kevx 51CTO博客,原文链接:http://blog.51cto.com/spinlock/170515,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如虎添翼!一款强大的本地文件全文搜索工具
已经对Everything、Listary这些桌面搜索工具耳熟能详,但是,它们有着明显的不足--只能搜索文件名称,却不能搜索文件内容。文本就来介绍一款免费、强大的本地数据全文搜索引擎--AnyTXT,让你的Windows搜索效率如虎添翼,文末有下载方式。
117 0
程序员之路:Linux文件搜索
程序员之路:Linux文件搜索
41 0
GPG实现文本或文件非对称加密
GPG可以用于安全性较高的非对称加密,以及对发件人的身份验证,以及数据的完整性校验。本文以图形界面操作步骤的形式简述GPG的使用。
1692 0
一个简单的二叉搜索树(C++实现)
参考:http://www.cnblogs.com/skywang12345/p/3576373.html 这里主要就是自己实现的代码,删除动作有点不一样: #ifndef __BSTREE_H__ #define __BSTREE_H__ /* 参考:http://www.
876 0
asp实现301跳转的方法
301重定向大家都知道它的好处了,可是,我们如何知道它是301重定向还是302重定向呢?真假301重定向检测方法  摘自阿权站长独立博客:http://www.seozz.net/zzseo/asp301.
938 0
ASP老项目中如何搜索一个文件在哪些地方被引用
ASP老项目中,我们经常会遇到要搜索一个文件在哪些地方被引用,从而修改那些引用它的文件。由于asp没有搜索功能,因此我们需要借助Visual Studio来解决。我们可以利用VS2008来打开一个网站,打开我们的asp项目的主目录。
556 0
+关注
20377
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载