收录日期:2019/04/20 16:47:27 时间: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 保存查找结果,下次就快了

请教如何通过脚本改变OBJECT的属性值 一个客户端变量(Javascript)如何取一个服务器端变量(vbscript) 大家帮我看看下面这段程序 请问各位大虾:我要根据数据库中的纪录生成一个图片(类似于常用的图表),该怎么做? 急!关于sdk环境配置的很奇怪的问题,大家帮帮我这个初学者吧。 内嵌的SQL语句过多执行是否会出错? CPU占用100%的问题 数组合并 小问题,vb如何挂接数据库,有几种方法? c#端口扫描问题,谢谢…… 关于计数器的问题 怎么获得其它网站页面的内容呢?网上有文章说用InetCtls.Inet,可是我一用就出错,该注册哪个DLL呢? 关于datagrid的问题希望高手进入(再线等,急) 关于datagrid的问题希望高手进入(再线等,急) 记得前些日子水园有兄弟在说什么短信轰炸机,我想要一个,谁有给我发一个,谢谢了!气死我了,整天有个手记骚扰我 delphi自带的例子在那里找呀? 偶mm和偶(转) 简单的问题! 各位大虾哥哥们帮帮忙!小妹考试不想挂啊!!!!!!!很急啊!礼拜四要交啊! c#关于短信的问题 一个sql语句问题!!! insert用法的问题!急!请指教!!!!!!!!!! 此数据窗口计算域的表达式怎么写? VSS 的使用问题。谁有VSS的学习资料? 初来水源,大家多关照,先发个笑话 有什么区别?? 帮忙解释一下 :szText MACRO Name, Text:VARARG 请问:如何察看dll导出函数的参数列表? 怎么获得其它网站页面的内容呢?网上有文章说用InetCtls.Inet,可是我一用就出错,该注册哪个DLL呢? 如何将一个bmp生成一个位图类啊?给100分