繁体   English   中英

使用Delphi获取Windows中所有索引文件的列表

[英]Get a list of all indexed files in Windows with Delphi

我想列出Windows使用Windows Indexing Service索引的所有文件。

指定的文件扩展名是可接受的。

例如:我正在使用一个软件来显示用户媒体,例如照片和视频。 我目前正在使用以下自定义过程自行查找文件:

function FindAllFiles_Safe(aDirectory, aFilter: string; aIncludeSubDirs: boolean): string;
  {$IFDEF DCC}
  var TD: TDirectory;
      SO: TSearchOption;
      DF: TStringDynArray;
      i: integer;
      sl: TStringList;

      MaskArray: TStringDynArray;
      Predicate: TDirectory.TFilterPredicate;
      {$ENDIF}
begin
  {$IFDEF FPC}
  result:=FindAllFiles(aDirectory,aFilter,aIncludeSubDirs).text;
  {$ENDIF}

  {$IFDEF DCC}
  MaskArray := SplitString(aFilter, ';');


  if aIncludeSubDirs=true then SO:=TSearchOption.soAllDirectories;

  Predicate :=
    function(const Path: string; const SearchRec: TSearchRec): Boolean
      var Mask: string;
    begin
      for Mask in MaskArray do
        if MatchesMask(SearchRec.Name, Mask) then
          exit(True);
      exit(False);
    end;

   //DF:=TD.GetFiles(aDirectory, Predicate, SO);
   DF:=TD.GetFiles(aDirectory, SO, Predicate);

   if length(DF)=0 then exit;


   sl:=TStringList.Create;
   for i := 0 to length(DF)-1 do sl.Add(DF[i]);

  result:=sl.Text;
  sl.Free;

  {$ENDIF}
end;

有没有办法访问Windows已建立索引的文件?
我想利用Windows Indexing Service来快速检索文件,而不是如果Windows以前已经做过的话就浪费资源。

查询Windows搜索索引的方法之一是使用ADO以及查询语法(AQS)和SQL。

试试这个示例代码(当然,您可以改进SQL语句以过滤和加快结果)

{$APPTYPE CONSOLE}

{$R *.res}

uses
  ADOInt,
  SysUtils,
  ActiveX,
  ComObj,
  Variants;


procedure  QuerySystemIndex;
var
  Connection : _Connection;
  RecordSet: _RecordSet;
  v: Variant;
begin;
  OleCheck(CoCreateInstance(CLASS_Connection, nil, CLSCTX_ALL, IID__Connection, Connection));
  OleCheck(CoCreateInstance(CLASS_RecordSet, nil, CLSCTX_ALL, IID__RecordSet, RecordSet));
  Connection.CursorLocation := adUseClient;
  Connection.Open('Provider=Search.CollatorDSO;Extended Properties=''Application=Windows'';', '', '', adConnectUnspecified);
  Recordset.Open('SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX', Connection, adOpenForwardOnly, adLockReadOnly, adCmdText);
  Recordset.MoveFirst;
  v:='System.ItemPathDisplay';
  while not Recordset.EOF do
   begin
      Writeln(Recordset.Fields.Item[v].Value);
      Recordset.MoveNext();
   end;
end;


begin
 try
    CoInitialize(nil);
    try
      QuerySystemIndex;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.

您可以在MSDN文档中找到访问“搜索索引”的替代方法。

有用于Windows搜索的API (以前称为Windows桌面搜索)。

但是,尽管Windows Search API无疑具有强大的功能,但我认为,仅基于文件扩展名(甚至文件名中的其他组成元素)查找文件,Windows Search API可能会被证明过于复杂并且带来的好处微不足道,除非您正在处理数量惊人的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM