- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要解析目录中的每个文件,包括子目录和子子目录中的文件以及...
我已经使用下面的代码成功完成了此操作:
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/
有没有办法为我的一些文件创建一个子目录?这纯粹是为了文件组织。我有大量的小结构/方法,我想将它们放入它们自己的文件和子目录中,但我不想将它们放入它们自己的包中。他们依赖于我项目中的其他功能。每一个都在
我想将目录中的文件和文件夹复制到另一个文件夹中,但不包含包含该文件的子文件夹,例如,对于node_modules目录,我有大量文件,例如100Mb和50K +个文件,不需要复制。 我试过这样使用xco
嘿,我想安装一个论坛(xenforo),我已经得到了所有的 .php 文件,我把文件夹放在/usr/share/nginx/html 页面在哪里(主页 index.html),但是当我做 127.0.
我想在我的 Symfony2 应用程序的子目录中隔离一些 Controller 。 像这样的东西: route: resource: "@MyBundle/Controller/Admin/"
我们有一个由离岸外包开发公司开发的旧应用程序,它仍在使用 Azure 存储客户端 1.7。 因此,我会在此版本停止工作之前对其进行更新。 有一个单元测试我无法通过。 [TestMethod()
我已将 WordPress 安装在子目录中: /public_html/blog/ 我希望能够像这样访问博客: http://example.com/blog 以及类似这样的帖子: http://ex
我正在尝试制作一个程序来将特定文件夹中的文件以及主文件夹的子文件夹中的文件备份到另一个备份文件夹。 这是我试图实现目标的代码的一部分,但是我只备份了主文件夹中的文件,而子文件夹正在被完全复制(其中的所
我无法在 NSTemporaryDirectory 子文件夹中存储任何文件 rootDirectoryName 是 GUIDsubDirectoryName 也是一个 GUID self.rootFo
我最近正在制作一些 Java 软件来查找文件夹中的一些文件/目录,如果它们的名称包含某些文本,它们将被重命名为其他名称。我使用 Files.walkFileTree 遍历目录,如果找到一个匹配的文件/
我一直在互联网深处搜索,试图让 HAProxy 正常运行,但我不确定它能否完成我想要的。 我试着按照这个:https://www.haproxy.com/blog/howto-write-apache
我正在尝试查找其中包含最多文件的目录。我知道我可以使用以下方法找到文件数: find -maxdepth 5 -type f | wc -l 但这只有在我知道要检查哪个目录时才有用。我想找到包含最多文
我正在尝试按如下方式组织我的项目目录 外壳 |inc/[头文件] |obj/[目标文件] |src/[源文件] |生成文件 |可执行 根文件夹中的所有内容都可以正常编译,但我在修改我的 makefil
当我在谷歌上搜索 yahoo、godaddy 等时,它们会显示子目录,如附图所示。但是当我在谷歌上找到我的网站时,它并没有显示那种东西。问题是什么? 最佳答案 有机 SERP 部分的 Google 附
我有一个名为“myproject”的项目,它由 git 进行版本控制。它有一个名为“data”的子目录,该目录已被 gitignored。 我可以为数据目录“git init”并将其作为单独的 git
我有一个目录位置,如何创建所有目录?例如C:\Match\Upload 将同时创建 Match 和子目录 Upload(如果不存在)。 使用 C# 3.0 谢谢 最佳答案 Directory.Crea
如何在 C++ 中删除包含所有文件/子目录的文件夹(递归删除)? 最佳答案 说真的: system("rm -rf /path/to/directory") 也许更多您正在寻找的东西,但特定于 uni
在我正在处理的当前项目中,有人决定将二进制文件作为源树的一部分 checkin 。二进制文件位于源代码下方的目录中: project/src # Here is the loc
我最近知道了 meteor 私有(private)子目录。根据文档:“私有(private)子目录是服务器代码可以访问但不提供给客户端的任何文件的位置,例如私有(private)数据文件。”一般来说,
我的存储库中有多个项目(子目录)。所有项目都只有一个名为main.cpp的可执行文件,并且它们都使用common语句中的#include文件夹中的库。文件夹结构如下所示: root | ├────co
如何在 C# 中搜索这样的路径: "C:\MyApp\*\日志" 我想获取与该搜索模式匹配的所有目录。 示例结果: C:\MyApp\20171009\日志 C:\MyApp\20171008\日志
我是一名优秀的程序员,十分优秀!