Delphi, как быстрее получить каталог сетевых дисков - PullRequest
1 голос
/ 05 ноября 2011

Я только что обнаружил, что некоторые программы очень быстро получают / выводят каталог сетевых дисков, почти мгновенно.Я говорю о таких программах, как 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 Ответ

3 голосов
/ 06 ноября 2011

Измените код, чтобы использовать интерфейс IShellFolder вместо функций Find...().Все в оболочке Windows внутренне представлено IShellFolder, ITEMIDLIST s и т. Д., Даже файловая система и сетевые пути.Когда производительность имеет значение, используйте собственные собственные данные Windows.Проводник Windows использует IShellFolder и соответствующие интерфейсы для всей своей основной работы.

...