运用多线程技术实现文件的快速搜索

从一名初学者到如今一名熟练的VC程序员,得益于VC知识库的帮助,一直想着该如何回报。现撰此文,一来略表心意,二来和VC爱好者交流。

操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很底。而且按此法编程十分烦琐,在目录层次很多时,往往不好处理。本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高。

其基本思想其实很简单,就是找到一个目录就开辟一个线程,文件的话当然在线程内就处理了。这样实现了同步搜索,速度当然快起来了。

本文程序运行效果图

以下介绍VC具体实现:

一、 搜索用到两个win32的两个函数:

HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData );
BOOL FindNextFile( HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData );

二、 建立线程函数

首先要定义线程的参数结构用于文件信息的传递:

typedef struct tagTHREADPARAM {
  CString strPath;
  CString strFileName;
}THREADPARAM m_param;

因为线程要操纵全局变量,所以定义互斥体:

CMutex m_mutexThreadCount,m_mutexThreadParam,m_mutexPath;

如果搜索完毕或搜索终止,要有事件通知,于是创建一个事件:

CEvent m_event(FALSE,FALSE,NULL,NULL);
UINT uThreadCount=0;//产生的线程数
CStringArray m_strPathArray;//存放搜索到的文件路径数组
//线程函数
UINT GetFilePathThreadProc(LPVOID pParam)
{
  if(pParam==NULL)
    AfxEndThread(NULL);
  THREADPARAM * m_pParam=(THREADPARAM *)pParam;
  CString strPath=m_pParam->strPath;
  CString strFileName=m_pParam->strFileName;
  m_mutexThreadCount.Lock();
  uThreadCount++;
  m_mutexThreadCount.Unlock();
  HANDLE hFile;
  WIN32_FIND_DATA *pInfo=new WIN32_FIND_DATA;
  hFile = ::FindFirstFile(strPath+"\\*.*",pInfo);
  if(hFile==INVALID_HANDLE_VALUE)
  {
    delete pInfo;
    m_mutexThreadCount.Lock();
    uThreadCount--;
    //所有的线程完成,则激活事件,通知应用程序完成搜索(下同)
    if(uThreadCount==0)
      m_event.SetEvent();
    m_mutexThreadCount.Unlock();
    return 0;
  }
  do{
    if(pInfo->cFileName[0]==''.'')
      continue;
    char cFileName[MAX_PATH];
    strcpy(cFileName,pInfo->cFileName);
    CString strFile=cFileName;
    if(pInfo->dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
    {
      //如果是目录,则开辟新的搜索线程
      m_mutexThreadParam.Lock();
      m_param.strPath=strPath+"\\"+strFile;
      m_param.strFileName=strFileName;
      AfxBeginThread(GetFilePathThreadProc,&m_param, THREAD_PRIORITY_NORMAL);
      m_mutexThreadParam.Unlock();
    }
    else
    {
      //如果是文件则直接与要搜索的文件比较
      if(strFile==strFileName){
        m_mutexPath.Lock();
        m_strPathArray.Add(strPath+"\\"+strFile);
        m_mutexPath.Unlock();
        m_mutexThreadCount.Lock();
        uThreadCount--;
        if(uThreadCount==0)
          m_event.SetEvent();
        m_mutexThreadCount.Unlock();
        return 0;
      }
    }    
  }
  while(::FindNextFile( hFile,pInfo));
  ::FindClose(hFile);
  delete pInfo;
  m_mutexThreadCount.Lock();
  uThreadCount--;
  if(uThreadCount==0)
    m_event.SetEvent();
  m_mutexThreadCount.Unlock();
  return 0;
}

时间: 2024-08-29 04:07:55

运用多线程技术实现文件的快速搜索的相关文章

VC下利用多线程实现文件的快速检索

操作系统一般都提供了文件搜索的功能,但采用的是顺序搜索,搜索效率很低.而且按此法编程十分烦琐,在目录层次很多时,往往不好处理.本文采用多线程技术实现文件的快速搜索,代码量很少,执行效率极高. 本文提出的多线程文件搜索的基本思想很简单,就是找到一个目录就开辟一个线程,而找到一个文件当然在线程内就处理了,这样实现了同步搜索. 以下介绍其在vc平台下的具体实现: 1.搜索用到两个win32的两个函数 HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIN

everything怎么快速搜索文件

  1.使用该软件之前要先说明一下这个软件搜索只支持ntfs格式文件,对于新的系统一般都是这个格式啦.打开我的电脑分区查看文件格式类型,如果是fat32格式请通过下面命令转换 Everything怎么用 1.打开everything工具,点击菜单---文件---新建搜素窗口,如图 2.在everything搜索窗口中输入您需要搜索的关键字,如[咗嚛] 3.由于出现的内容有很多,我们可以点击类型进行排序,比如我只要doc文件,也可以鼠标右侧选择调出其他类型 4.如果搜索的项目很多,通过类型查找比较

《Total Commander:万能文件管理器》——第9.5节.更快速搜索文件

第9.5节.更快速搜索文件 搜索文件其实有2种方式.第一种是实时搜索原始数据,比如TC和资源管理器就是这样搜索文件的.也就是说,软件将用户提交的条件与当前的实际文件系统进行比较,找出符合的目标.这种搜索可以找到最新的文件,具有实时性,但速度较慢.另一种方式是:先为硬盘文件事先建立索引数据库,然后将搜索条件与数据库进行比较,找到命中结果.其优点是速度明显加快,缺点是因为数据库不是实时更新,所以有时结果会有遗漏. 但从实用角度来看,后一种方式是可取的.因为多数情况下,我们寻找的文件都是旧文件.如果是

利用ASP技术实现文件直接上传功能

上传|上传 摘要: 本文首先比较了几种常见的文件上传技术,然后通过实例介绍了利用ASP技术直接实现文件上传的具体方法. 关键词:ASP:文件上传:二进制数据 引言 采用WEB技术实现B/S(浏览器/服务器)结构的管理系统是办公自动化的发展趋势.基于WEB技术的管理系统,由于开发周期短:与用户平台无关:易于实现交互式应用:能对信息进行快速.高效的收集.处理和发布,近几年来得到了迅速发展.而ASP技术由于其开发效率高.交互性好,安全性强等特点,逐渐成为开发管理系统的首选工具. 许多基于WEB的应用都

Win7系统如何快速搜索到后缀名为jpg格式的图片

  Win7系统如何快速搜索到后缀名为jpg格式的图片          具体方法如下: 解决方法一: 1.打开电脑,点击桌面上的[计算机],小编是win7系统,所以是计算机; 2.打开计算机文件夹后,在右上角搜索计算机框中,会出现3种格式,类型.修改日期.大小,一般找图片都是选择类型,点击[类型]; 3.输入图片类型格式,这里先输入jpg,输入完后会自动搜索,现在就开始在搜索jpg格式的所有图片; 4.如果要找png格式图片,输入png就可以,任何格式的图片都是输入后缀名就可以; 解决方法二:

【阿里云产品公测】大数据下精确快速搜索OpenSearch

相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like 或者FIND_IN_SET来实现.后者性能稍微好点但是必须要逗号分隔才可以实现匹配.甚至多条件的话还可能用到OR这是极影响系统性能的.        最近公司项目需要.主要是系统查询缓慢.并且查询精度不敢恭维.一开始想到的是Lucene 毕竟是一个开放源代码的全文检索引擎工具包 并且官方还在持续更新中.当时闲暇时间大概搞了将近一个星期的时间.索引的增删查改以及中文分词IKAnalyzer

基于Ajax技术实现文件上传带进度条_AJAX相关

1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运行本实例,如图1所示,访问文件上传页面,单击"浏览"按钮选择要上传的文件,注意文件不能超过50MB,否则系统将给出错误提示.选择完要上传的文件后,单击"提交"按钮,将会上传文件并显示上传进度. 2.技术要点 主要是应用开源的Common-FileUpload组件来实现分

java多线程读写同一个文件

问题描述 同一个文件可以同时被一个线程读另一个线程写吗? 解决方案 如果有一个线程正在读文件,这时又有另个一个线程想来写这个文件 会报错吗?答案是不会.请运行以下的代码 就知道了package org.sse.test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOExc

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.