gpt4 book ai didi

delphi - 解析目录和子目录中的所有文件时的 IdFTP 性能问题

转载 作者:行者123 更新时间:2023-12-03 02:17:03 29 4
gpt4 key购买 nike

我需要解析目录中的每个文件,包括子目录和子子目录中的文件以及...
我已经使用下面的代码成功完成了此操作:

class function TATDFTPUtility.findAllDirectoryFiles(var ftpClient: TIdFTP; directory: String; deepness: Integer = 0): TidFTPListItems;
var
I: Integer;
localDirectoryListing: TIdFTPListItems;
baseDirectory: string;
begin
Result := TIdFTPListItems.Create;
*// this function uses ftpClient.ChangeDirUp until it reaches the '' directory*
changeUpToDirectory(ftpClient, '');
try
ftpClient.ChangeDir(directory);
ftpClient.List;
Result.Assign(ftpClient.DirectoryListing);
localDirectoryListing := Result;
baseDirectory := ftpClient.RetrieveCurrentDir;
for I := 0 to localDirectoryListing.Count - 1 do
begin
if (localDirectoryListing.Items[i].ItemType = ditDirectory) then
begin
result := addTwoFTPListItems(result, findAllDirectoryFiles(ftpClient, baseDirectory + '/' + localDirectoryListing.Items[i].FileName));
end;
end;
except
end;
end;

class function TATDFTPUtility.addTwoFTPListItems(listA: TIdFTPListItems; listB: TIdFTPListItems): TidFTPListItems;
var
i: integer;
begin
Result := listA;
for I := 0 to listB.Count - 1 do
begin
with Result.Add do
begin
Data := listB.Items[i].data;
Size := listB.Items[i].Size;
ModifiedDate := listB.Items[i].ModifiedDate;
LocalFileName := listB.Items[i].LocalFileName;
FileName := listB.Items[i].FileName;
ItemType := listB.Items[i].ItemType;
SizeAvail := listB.Items[i].SizeAvail;
ModifiedAvail := listB.Items[i].ModifiedAvail;
PermissionDisplay := listB.Items[i].PermissionDisplay;
end;
end;
end;

现在的问题是这需要大约 15-20 分钟!!!有没有更有效的方法?
以下是有关此特定案例的一些事实:
1-运行程序后,它发现大约 12000 个文件,几乎有 100-200 个目录,但最高深度约为 7
2-我只需要解析,不需要下载或上传任何东西
3-我使用异常的原因是因为 FTP 内部有一些我无权访问的文件夹,这会导致 IdFTP 中出现访问冲突错误,并且我使用 try... except 忽略任何无法访问的目录。

最佳答案

您正在调用ChangeDirUp() (可能很多次?)然后调用 ChangeDir()然后。如果directory是绝对路径,你可以直接调用ChangeDir()一次直接跳转到目标文件夹并避开ChangeDirUp()共。 findAllDirectoryFiles() 内部的递归循环正在使用 RetrieveCurrentDir() 中的绝对路径,因此重复调用ChangeDirUp()ChangeDir()都被浪费了。通过不必在文件夹树中上下导航,您可以大大减少开销。

findAllDirectoryFiles()返回一个新分配的TIdFTPListItems调用者必须释放。这本身通常是一个糟糕的设计选择,但特别是在这种情况下,因为递归循环没有释放那些辅助 TIdFTPListItems根本没有对象,所以它们正在被泄漏。

将文件添加到输出时TIdFTPListItems ,您只添加它们的文件名而不是它们的路径。如果调用者不知道每个文件在哪里找到,那么递归搜索文件有什么好处呢?或者您只关心文件名而不关心路径?

您忽略了deepness参数完整。

话虽如此,尝试更像这样的东西:

class procedure TATDFTPUtility.findAllDirectoryFiles(ftpClient: TIdFTP; const directory: String;var files: TIdFTPListItems; deepness: Integer = -1);
var
I: Integer;
baseDirectory: string;
subDirectories: TStringList;
item: TIdFTPListItem;
localDirectoryListing: TIdFTPListItems;
begin
try
if directory <> '' then
ftpClient.ChangeDir(directory);
ftpClient.List;
except
Exit;
end;
baseDirectory := ftpClient.RetrieveCurrentDir;
localDirectoryListing := ftpClient.DirectoryListing;
subDirectories := nil;
try
for I := 0 to localDirectoryListing.Count - 1 do
begin
case localDirectoryListing[i].ItemType of
ditFile: begin
item := files.Add;
item.Assign(localDirectoryListing[i]);
// if you need the full path of each file...
item.FileName := baseDirectory + '/' + item.FileName;
end;
ditDirectory: begin
item := localDirectoryListing[i];
if ((item.FileName <> '.') and (item.FileName <> '..')) and
((deepness = -1) or (deepness > 0)) then
begin
if subDirectories = nil then
subDirectories := TStringList.Create;
subDirectories.Add(baseDirectory + '/' + item.FileName);
end;
end;
end;
end;
if subDirectories <> nil then
begin
if (deepness > 0) then Dec(deepness);
for I := 0 to subDirectories.Count - 1 do begin
findAllDirectoryFiles(ftpClient, subDirectories[I], files, deepness);
end;
end;
finally
subDirectories.Free;
end;
end;

调用findAllDirectoryFiles()时第一次可以设置 directory到:

  • 一个空白字符串,用于在当前目录中开始搜索。

  • 相对于当前目录的子文件夹。

  • 相对于服务器根目录的绝对文件夹。

并设置deepness到任一

  • -1 表示无限递归

  • >= 0 指定递归深度。

files := TIdFTPListItems.Create;
try
TATDFTPUtility.findAllDirectoryFiles(ftpClient, 'desired directory', files, desired deepness);
// use files as needed...
finally
files.Free;
end;

关于delphi - 解析目录和子目录中的所有文件时的 IdFTP 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40631359/

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