收录日期:2019/06/20 13:39:20 时间:2016/06/01 15:44:14 标签:基础类
怎样在当前硬盘类搜索文件,获取文件路径,知道存在否。要在硬盘中遍历。
搜索一下吧,以前讲过,大致就是
FindFirstFile
FindNextFile
FAQ没有
要不要考虑效率?!
如果不太介意效率,很容易实现啦
就用BCB的函数就可以轻易实现,不用考虑效率的话,说声……
你可以用C的!
FindFirstFile
FindNextFile
也可以参考一下,BCB自带的一些函数:FileOpen,FileExists...你可以点帮助,可以看一组关于文件操作的函数!
if (!FindFirst(strStartDirectory + strTargetFileName, faAnyFile, stSearchRec))
{
do
{
if (stSearchRec.Name != "." && stSearchRec.Name != "..")
{
pListItem = pListView->Items->Add();
pListItem->Caption = stSearchRec.Name;
pListItem->SubItems->Add(strImageFileName);
pListItem->SubItems->Add(strDisplayPath);
pFileName->Add(stSearchRec.Name);
pImageFileNamePath->Add(strImageFileName);
pFilePath->Add(strDisplayPath);
}
Application->ProcessMessages();
} while (!FindNext(stSearchRec));
}

FindClose(stSearchRec);


if (!FindFirst(strStartDirectory + "*.*", faAnyFile, stSearchRec))
{
do
{
if (((stSearchRec.Attr) & faDirectory) == faDirectory)
{
if (stSearchRec.Name != "." && stSearchRec.Name != "..")
{
FindFile(strStartDirectory + stSearchRec.Name + "\\", strImageItemName, strImageFileName,
pShowLabel, strTargetFileName, pListView, bFindFileCancel, pFileName,
pImageFileNamePath, pFilePath);
}
Application->ProcessMessages();
if (bFindFileCancel)
{
return;
}
}
}while (!FindNext(stSearchRec));
}
FindClose(stSearchRec);
应该是楼上的代码!
看看这个试试?
在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介
http://blog.csdn.net/pinson/archive/2005/01/15/254346.aspx
//遍历磁盘
//Aweay 2003-2-10
#ifndef BROWSEDIR
#define BROWSEDIR
#include <vcl.h>
#include <windows.h>
#include <Classes.hpp>

#define BD_FIND_DIR 0
#define BD_FIND_FILE 1
#define BD_FIND_COMPLETE 2 //查询完毕
#define BD_FIND_ABORT    3 //查询中断

//Error define
#define BD_ERR_OK         0
#define BD_ERR_NOFILTER   1
#define BD_ERR_NOCALLBACK 2
#define BD_ERR_NOTARGET   3

//Thread
#define BD_EXIT_NORMAL 0
#define BD_EXIT_ABORT 1

typedef void __fastcall (__closure *BDCallBack)(String path,int type); //回调函数类型

class TBrowseDir : public TThread //遍历整个磁盘的类
{
protected:
  void __fastcall Execute();
private:
  TStringList* lstDir; //用于保存临时目录
  TStringList* lstFilter; //保存多种查找目标
  TStringList* lstTarg;
  BDCallBack lpFunc;  //当找到目标时将调用这个函数指针指向的函数
  String PathString(String pn); //返回带\\结尾的文件夹名称
  int SearchDir(String dir);
  WIN32_FIND_DATA filedata;
  String tmpFn;
  int    tmpType;
  void __fastcall CallBack();
  void OnFind(String fn, int n);
  int AddSubDir(String strParent);
public:
  TBrowseDir(bool CreateSuspended);
  __fastcall virtual ~TBrowseDir(void);
  void SetCallBack(BDCallBack lpF);
  void AddFilter(String strFil);
  int Find();
  void AddFilte(TStringList* lstF);
  void AddTarget(String dir);
};

TBrowseDir::TBrowseDir(bool CreateSuspended)
  :TThread(CreateSuspended)
{
  //TODO: Add your source code here
  lstDir=new TStringList();
  lstFilter=new TStringList();
  lstTarg=new TStringList();
  lpFunc=NULL;
}

__fastcall TBrowseDir::~TBrowseDir()
{
  //TODO: Add your source code here
  delete lstDir;
  delete lstFilter;
  delete lstTarg;
}
/*设置回调函数,函数的类型为BDCallBack,原形如下
typedef void __fastcall (__closure *BDCallBack)(String path,int type)
当找到文件或文件夹或查找完毕将调用这个函数。
其中:
path 根据type不同表示找到的文件或文件夹,如果type返回BD_FIND_COMPLETE,则path为空
type 可以取值
  BD_FIND_FILE 找到文件
  BD_FIND_DIR 找到文件夹
  BD_FIND_COMPLETE 查找完毕
*/
void TBrowseDir::SetCallBack(BDCallBack lpF) //设置回调函数
{
  //TODO: Add your source code here
  lpFunc=lpF;
}

void TBrowseDir::AddFilter(String strFil)  //添加一种查找类型,例如*.txt
{
  //TODO: Add your source code here
  lstFilter->Add(strFil);
}

/*
用于遍历磁盘的主函数
dir表示要遍历的磁盘目录,比如"c:\\"
调用Find函数之前需要调用AddFilter函数和SetCallBack函数
*/
int TBrowseDir::Find() //查找/遍历文件夹
{
  //TODO: Add your source code here
  if(lstFilter->Count<=0)
    return BD_ERR_NOFILTER;
  if(lpFunc==NULL)
    return BD_ERR_NOCALLBACK;
  if(lstTarg->Count<=0)
    return BD_ERR_NOTARGET;

  memset(&filedata,0,sizeof(filedata));
  Resume();
  return BD_ERR_OK;
}

String TBrowseDir::PathString(String pn)
{
  //TODO: Add your source code here
  if(pn.SubString(pn.Length(),1)=="\\")
    return pn;
  else
    return pn+String("\\");
}

int TBrowseDir::SearchDir(String dir)
{
  //TODO: Add your source code here
  HANDLE re;
  for(int n=0;n<lstFilter->Count;n++)
  {
    String findit=lstFilter->Strings[n];
    re=FindFirstFile(findit.c_str(),&filedata);
    if(re!=INVALID_HANDLE_VALUE)
    {
      if(strcmp(filedata.cFileName,"..")!=0
        && strcmp(filedata.cFileName,".")!=0) //如果时文件夹并且不是上一层文件夹和自身
      {
        if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0)
          lstDir->Add(dir+String(filedata.cFileName));
        else //找到了文件
          OnFind(dir+filedata.cFileName,BD_FIND_FILE);
      }
      while(FindNextFile(re,&filedata))
      {
        if(Terminated)         //处理用户终止
          return BD_EXIT_ABORT;

        if(strcmp(filedata.cFileName,"..")!=0
          && strcmp(filedata.cFileName,".")!=0)
        {
          if((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) !=0)
            lstDir->Add(dir+String(filedata.cFileName));
          else
            OnFind(dir+String(filedata.cFileName),BD_FIND_FILE);
        }
      }
    }
    FindClose(re); //释放
  }
  return BD_EXIT_NORMAL;
}

void __fastcall TBrowseDir::Execute()
{
  //---- Place thread code here ----
  for(int m=0;m<lstTarg->Count;m++)
  {
    String strDir=PathString(lstTarg->Strings[m]);
    OnFind(strDir,BD_FIND_DIR);
    AddSubDir(strDir);//添加子文件夹
    SetCurrentDirectory(strDir.c_str());
    int re=SearchDir(strDir);
    if(re==BD_EXIT_ABORT)
    {
      OnFind("",BD_FIND_ABORT);
      return;
    }
    int n=lstDir->Count;
    while(n>0)   //如果n>0证明还有文件夹没有扫描
    {
      String dn=PathString(lstDir->Strings[0]);
      OnFind(dn,BD_FIND_DIR);
      re=AddSubDir(dn);
      if(re==BD_EXIT_ABORT)
      {
        OnFind("",BD_FIND_ABORT);
        return;
      }
      SetCurrentDirectory(dn.c_str()); //设置当前工作目录
      lstDir->Delete(0);
      re=SearchDir(dn);
      if(re==BD_EXIT_ABORT)
      {
        OnFind("",BD_FIND_ABORT);
        return;
      }
      n=lstDir->Count;
    }
  }
  OnFind("",BD_FIND_COMPLETE);
}

void __fastcall TBrowseDir::CallBack() //调用回调函数
{
  //TODO: Add your source code here
  lpFunc(tmpFn,tmpType);
}

void TBrowseDir::OnFind(String fn, int n)
{
  //TODO: Add your source code here
  tmpFn=fn;
  tmpType=n;
  Synchronize(CallBack);  //VCL多线程阻塞
}
void TBrowseDir::AddFilte(TStringList* lstF) //重载方法
{
  //TODO: Add your source code here
  lstFilter->AddStrings(lstF);
}

int TBrowseDir::AddSubDir(String strParent) //添加strParent下的子目录
{
  //TODO: Add your source code here
  TSearchRec fileinfo;
  memset(&fileinfo,0,sizeof(fileinfo));
  int re=FindFirst(strParent+"*.*",faDirectory,fileinfo);
  if(re==0)
  {
    if((fileinfo.Attr & faDirectory)!=0
      && fileinfo.Name!="."
      && fileinfo.Name!="..")
      lstDir->Add(strParent+fileinfo.Name);
    while(FindNext(fileinfo)==0)
    {
      if(Terminated)
        return BD_EXIT_ABORT;
      if((fileinfo.Attr & faDirectory)!=0
        && fileinfo.Name!="."
        && fileinfo.Name!="..")
      lstDir->Add(strParent+fileinfo.Name);
    }
  }
  FindClose(fileinfo);
  return BD_EXIT_NORMAL;
}

void TBrowseDir::AddTarget(String dir)
{
  //TODO: Add your source code here
  lstTarg->Add(dir);
}
#endif
用我以上的算法遍历一个10g的硬盘(及指定*.*搜索)需要用50秒,而windows自带的查找文件功能查找*.*文件只需要20秒钟的时间???
为了提高速度,我没有采用递归算法,而且尽量使用API函数,可是还是有这么大的差距。
望高手指教。。。

我想过用TreeView的,也是考虑可能太缓慢。还是想搜索快点。
windows 保存查找结果,下次就快了

请问正版的MSDN大概要多少钱? 如何找到mstcpip.h mysql改密码怎么这么麻烦呀? 請問在asp.net中怎樣將SQLSERVER數據庫導入進EXCEL後該文件自動打開 如何通过编程实现更改 网络连接-〉tcp/ip属性的功能? 求助!在widows 2000 adv上安装vs.net2002的问题! 【调查】水源的兄弟姐妹中:凡是从来没有恋爱过的人请来这里注册,谢谢 【调查】水源的兄弟姐妹中:凡是有过恋爱但是至今没有结婚的请来这里注册,谢谢 我关闭窗口的时候怎样才能不弹出提示窗口? 我想做一个注册的程序,怎么做?想写数据到EXE文件中. 写了一个applet的java程序,请问用命令行怎么生成网页? 【调查】水源的兄弟姐妹中:凡是同居但是没有结婚的请来这里注册,谢谢 哪有turbo c的安装程序? 谁能给出画箭头的算法? 没有APP SERVER的情况下如何实现事务? 【调查】水源的兄弟姐妹中:凡是结婚但是没有离婚的请来这里注册,谢谢 将ascii码转化为字符的函数 请推荐用VB6.0+SQL(ADO)编程的书、网站? 写文件时的奇怪问题 关于白盒测试中,各种条件覆盖,哪本书有详细介绍? adsl上网 pb中的com组件连接sql server 写一个函数用datastore retrieve,不成功? 不用MFC,如何将DBGRID.OCX插入到对话框中? pb8.0如何执行oracle 匿名块(anonymous pl/sql blocks) 【调查】水源的兄弟姐妹中:凡是结婚但是后来离婚的请来这里注册,谢谢 LinkButton的下划线怎么去掉!?用去超链下划线的办法无效! 写C程序现在用什么开发环境呀? 刚学.NET 遇上一个小问题,诚意请教。 有关快速排序的问题!50分~~! 字符串的问题