Delphi如何更快地获取网络驱动器的目录

时间:2011-11-05 18:59:34

标签: performance delphi networking directory

我刚刚发现某些程序在获取/列出网络驱动器目录时非常快,几乎是即时的。我在这里谈论像FreeComanderXE和DirectoryOpus这样的程序。

在我的程序中,执行相同的任务需要几秒钟。我该怎么做才能提高速度。

这是我在线程中加载目录的代码:

procedure LoadDirThread.Execute;
var
  PIdx: Integer;
  b: Boolean;
  n: Integer;
  FName: string;
  Item: TXplorerItem;
  i: Integer;
  Path: String;
  SR: TSearchRec;
  SFI: TSHFileInfo;
  FData: TXplorerItem;
begin
  inherited;
  if not XPlorerLink.Loaded then
  begin
    Path := XPlorerLink.Path;
    PIdx := XPlorerLink.PathList.IndexOf(Path);
    if PIdx = -1 then
      PIdx := XPlorerLink.PathList.Add(Path);

    if FindFirst(Path + '*.*', faAnyFile - faHidden, SR) = 0 then
    begin
      repeat
        if (SR.Name <> '.') and (SR.Name <> '..') then
        begin
          if (SR.Attr and faDirectory <> 0) then
          begin
            FData := TXplorerItem.Create;
            FName := Path + SR.Name;
            SHGetFileInfo(PChar(FName), 0, SFI, SizeOf(SFI), SHGFI_DISPLAYNAME or
              SHGFI_TYPENAME);
            FData.FAttr:= SR.Attr;
            FData.Kind := xiDir;
            FData.Size := 0;
            FData.Caption := Strpas(SFI.szDisplayName);
            if FData.Caption = '' then
              FData.Caption := ChangeFileExt(SR.Name, '');
            FData.Name := SR.Name;
            FData.Modified := FileDateToDateTime(SR.Time);
            FData.ImgIdx := -1;
            n := XPlorerLink.InfoList.IndexOf(SFI.szTypeName);
            if n = -1 then
              n := XPlorerLink.InfoList.Add(SFI.szTypeName);
            FData.InfoIdx := n;
            FData.PathIdx := PIdx;
            XPlorerLink.Items.Add(FData);
          end
          else
          if (SR.Attr and faDirectory = 0) then
          begin
            FData := TXplorerItem.Create;
            FName := Path + SR.Name;
            SHGetFileInfo(PChar(FName), 0, SFI, SizeOf(SFI), SHGFI_DISPLAYNAME or
              SHGFI_TYPENAME);
            FData.FAttr:= SR.Attr;
            FData.Kind := xiFile;
            FData.Size := SR.Size;
            FData.Caption := Strpas(SFI.szDisplayName);
            if FData.Caption = '' then
              FData.Caption := ChangeFileExt(SR.Name, '');
            FData.Name := SR.Name;
            FData.Modified := FileDateToDateTime(SR.Time);
            FData.ImgIdx := -1;
            n := XPlorerLink.InfoList.IndexOf(SFI.szTypeName);
            if n = -1 then
              n := XPlorerLink.InfoList.Add(SFI.szTypeName);
            FData.InfoIdx := n;
            FData.PathIdx := PIdx;
            XPlorerLink.Items.Add(FData);
          end;
        end;
      until (FindNext(SR) <> 0) or Terminated;
      FindClose(SR);
    end;
  end;
  if not Terminated then
    PostMessage(frmMain.Handle, CM_UPDATEVIEW, -2, Integer(XPlorerLink));
end;

1 个答案:

答案 0 :(得分:3)

更改代码以使用IShellFolder界面而不是Find...()功能。 Windows Shell中的所有内容都由IShellFolderITEMIDLIST等内部表示,甚至是文件系统和网络路径。当性能很重要时,请使用Windows自己的本机数据。 Windows资源管理器使用IShellFolder及其相关接口来完成所有主要工作。