我剛剛發現,幾乎立即獲取/列出網絡驅動器的目錄時,某些程序非常快。我在這裏討論像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;
如何刪除所有的UI代碼,只關注'FindFirst/FindNext'代碼。當你這樣做的時候,看看它的表現如何。所有其他的東西只是分散注意力。 –
那麼我已經試過了,沒有太大的改進。它仍然比其他瀏覽器需要幾秒鐘。 –
正如David所建議的那樣,您需要從這裏的問題中去掉所有與UI相關的代碼。期望人們通過與你想獲得幫助的問題無關的代碼進行溝通是不太合理的,並且額外的混亂使得很難找出如何幫助你。將其減少到顯示問題的最小代碼量。 –