Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Delphi获取Windows中所有索引文件的列表_Windows_File_Delphi_Indexing - Fatal编程技术网

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

使用Delphi获取Windows中所有索引文件的列表,windows,file,delphi,indexing,Windows,File,Delphi,Indexing,我想列出windows使用其索引索引的所有文件 可以接受指定的文件扩展名 例如:我正在开发一个软件,它可以向用户展示照片和视频等媒体。我目前正在使用以下自定义过程自己查找文件: function FindAllFiles_Safe(aDirectory, aFilter: string; aIncludeSubDirs: boolean): string; {$IFDEF DCC} var TD: TDirectory; SO: TSearchOption; DF

我想列出windows使用其索引索引的所有文件

可以接受指定的文件扩展名

例如:我正在开发一个软件,它可以向用户展示照片和视频等媒体。我目前正在使用以下自定义过程自己查找文件:

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索引服务快速检索文件,而不是浪费资源,如果Windows以前已经这样做了。

(以前称为Windows桌面搜索)

然而,尽管Windows Search API无疑是非常强大的,但我认为只要根据文件扩展名(甚至文件名中的其他组成元素)定位文件,Windows Search API可能会非常复杂,并且提供的好处微乎其微,除非您处理的文件数量非常多。

(以前称为Windows桌面搜索)

然而,尽管Windows Search API无疑是非常强大的,但我认为只要根据文件扩展名(甚至文件名中的其他组成元素)定位文件,Windows Search API可能会非常复杂,并且提供的好处微乎其微,除非您处理的文件数量非常多。

其中一种方法是使用ADO、查询语法(AQS)和SQL

尝试此示例代码(当然,您可以改进SQL语句以过滤并加速结果)

您可以在上找到访问搜索索引的替代方法。

其中一种方法是使用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.