当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > 一个C++类实现文件全盘搜索

C/C++
2009年编程开发语言的使用率
C++对象模型笔记:dynamic binding
cstl -- c语言编写通用数据结构和常用算法库(模仿SGI STL)
子串匹配:不回溯算法
C++ Builder 访问 USB 口的方法
C++中二维数组的动态分配
数组和指针在编译的时候的区别
如何利用doxygen生成pdf文档
有关C++析构函数的异常(Exceptions in Destructors)
C++模板学习之函数对象之谓词
5月编程语言排行榜:D语言风采不再
一个C++类实现文件全盘搜索
C语言编程宝典之一 读书笔记
C语言嵌入式系统编程修炼(内存操作)
C++内存管理
带头结点的双循环链表
有关VA_LIST的用法
C++标准库简介(转)
一个栈类的实现(链栈)
C 引用与指针的比较

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 458 ::
收藏到网摘: n/a

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

 
  #include <windows.h>
#include <shlwapi.h>
#include <iostream>

#pragma comment(lib,"shlwapi.lib")

using namespace std;

//定义过滤器的最大数量
#define CONST_MAX_FILTER 16
//链表的数据结构
typedef struct tagList{
  TCHAR szFile[MAX_PATH];
  struct tagList *NextFile;
}FileList, *PFileList;
//主体类
class CHunter{
public:
  CHunter();
  ~CHunter();

  void AddFilter( TCHAR *szFilter );//添加过滤器
  void CHunter::Hunt( TCHAR *szPath );
  TCHAR *GetFile();//取得链表中的文件
  DWORD    GetFileCount();//取得文件的数量

private:
  PFileList headNode;//链表头
  PFileList currNode;

  void AddFile( TCHAR *szFile );
  void HuntFile( char *lpPath ) ;

  TCHAR    szFilter[CONST_MAX_FILTER][5] ;
  DWORD    dwFilterCount ;
  DWORD    dwFileCount ;
};

CHunter::CHunter():dwFilterCount(0),dwFileCount(0)
{
  headNode = (FileList *)malloc( sizeof(FileList) );
  headNode->NextFile = NULL;
  currNode = headNode;
  for(int i=0; i< CONST_MAX_FILTER; i++)
    ZeroMemory( szFilter[i], 5 ) ;
}

CHunter::~CHunter()
{
  PFileList next, tmp;
  tmp = headNode;

  while( tmp->NextFile != NULL )
  {
    next = tmp->NextFile ;
    free(tmp);
    tmp = next;
  }
  free(tmp);
}

//添加过滤器,比如.txt,为了简省,没有考虑文件扩展名长度大于4的情况
//请自行修改
void CHunter::AddFilter( TCHAR *szInp )
{
  if( strlen(szInp) > 4 )
    return;
  strncpy( szFilter[dwFilterCount++], szInp, 5 );
}

void CHunter::AddFile( TCHAR *szFile )
{
  currNode->NextFile = (FileList *)malloc( sizeof(FileList) );
  currNode = currNode->NextFile;    
  ZeroMemory(currNode->szFile, MAX_PATH );
  currNode->NextFile = NULL ;
  strncpy( currNode->szFile, szFile, MAX_PATH );
  dwFileCount++;
}

//这是入口函数,调用它即可开始搜索,这个路径的尾部不应有反斜杠
void CHunter::Hunt( TCHAR *szPath )
{
  HuntFile( szPath );
  currNode = headNode->NextFile;
}

DWORD CHunter::GetFileCount()
{
  return this->dwFileCount;
}

//这个函数依次遍历链表中的文件,并返回一个文件名
TCHAR *CHunter::GetFile()
{
  TCHAR *szRet;
  szRet = currNode->szFile;
  currNode = currNode->NextFile;

  return szRet;
}

void CHunter::HuntFile(char * lpPath)
{
        char szFind[MAX_PATH];
  char szFile[MAX_PATH];
        WIN32_FIND_DATA FindFileData;

  ZeroMemory(szFind,MAX_PATH);
        ZeroMemory(szFile,MAX_PATH);
  strcpy(szFind,lpPath);
        strcat(szFind,"\\*.*");

        HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
        if(INVALID_HANDLE_VALUE == hFind)        return;
        
        while(TRUE)
        {
                if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                        if(FindFileData.cFileName[0]!='.')
                        {
                                strcpy(szFile,lpPath);
                                strcat(szFile,"\\");
                                strcat(szFile,FindFileData.cFileName);
                                HuntFile(szFile);
                        }
                }
                else
                {
      strcpy(szFile,lpPath);
                        strcat(szFile,"\\");
      strcat(szFile,FindFileData.cFileName);
                        //cout << szFile << FindFileData.cFileName << endl;
      for( int i=0; i< dwFilterCount; i++ )
        if( strncmp(szFilter[i], PathFindExtension(szFile), 5) == 0 )
          this->AddFile( szFile );
                }
                if(!FindNextFile(hFind,&FindFileData))        break;
        }
        FindClose(hFind);
}

//示例,搜索D盘所有的exe文件
int main(int argc, char* argv[])
{
        CHunter hunter;
  hunter.AddFilter(".exe");
  hunter.Hunt("D:");

  cout<< hunter.GetFileCount() << endl;
  for(int i=0; i< hunter.GetFileCount(); i++)
    cout<< hunter.GetFile() << endl;
  return 0;
}