gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:44:13 25 4
gpt4 key购买 nike

我刚刚发现有些程序在获取/列出网络驱动器的目录时非常快,几乎是即时的。我在这里谈论的是 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;

最佳答案

更改您的代码以使用 IShellFolder接口(interface)而不是 Find...()职能。 Windows Shell 中的所有内容在内部由 IShellFolder 表示。 , ITEMIDLIST s 等,甚至文件系统和网络路径。当性能很重要时,请使用 Windows 自己的 native 数据。 Windows 资源管理器使用 IShellFolder及其所有主要工作的相关接口(interface)。

关于performance - Delphi如何更快地获取网络驱动器目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com