Мне нужно разобрать каждый файл в каталоге, включая файлы в подкаталогах и подкаталогах, и...
Я уже успешно сделал это, используя приведенный ниже код:
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 есть несколько папок, к которым у меня нет доступа, и это вызывает ошибку access violation
в IdFTP
, и я использовал try...except
, чтобы игнорировать любой каталог, который может не получить доступ.