2011-11-05 82 views
1

我剛剛發現,幾乎立即獲取/列出網絡驅動器的目錄時,某些程序非常快。我在這裏討論像FreeComanderXE和DirectoryOpus這樣的程序。Delphi如何更快地獲取網絡驅動器的目錄

在我的程序中,需要幾秒鐘才能完成相同的任務。我能做些什麼來提高速度。

這是我在加載一個線程目錄代碼:

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; 
+3

如何刪除所有的UI代碼,只關注'FindFirst/FindNext'代碼。當你這樣做的時候,看看它的表現如何。所有其他的東西只是分散注意力。 –

+0

那麼我已經試過了,沒有太大的改進。它仍然比其他瀏覽器需要幾秒鐘。 –

+0

正如David所建議的那樣,您需要從這裏的問題中去掉所有與UI相關的代碼。期望人們通過與你想獲得幫助的問題無關的代碼進行溝通是不太合理的,並且額外的混亂使得很難找出如何幫助你。將其減少到顯示問題的最小代碼量。 –

回答

3

更改您的代碼以使用IShellFolder接口,而不是Find...()功能。 Windows Shell中的所有內容均由IShellFolderITEMIDLIST等內部表示,甚至包括文件系統和網絡路徑。性能問題時,請使用Windows自己的本地數據。 Windows資源管理器使用IShellFolder及其所有主要工作的相關接口。

+0

是的,我認爲這是獲得我想要的速度的唯一方法。我希望避免它,但似乎我沒有其他選擇。感謝您的建議。現在我需要刷新我對shell的記憶。 –

+0

很可能是shell本身調用FindFirstFile ..... –

+2

你接受了答案,你覺得有很大的改進嗎?告訴我們! –