gpt4 book ai didi

delphi - ICS FTP - 检查 ftp 服务器上是否存在文件夹的功能

转载 作者:行者123 更新时间:2023-12-01 22:37:46 27 4
gpt4 key购买 nike

我正在尝试创建一个函数来使用 Overbyte ICS FTP 组件检查文件夹是否存在。使用 icsftp 中的 DIR 命令不会在我的备忘录日志中显示任何内容。我有兴趣将 dir 命令的结果解析为字符串列表,以便搜索特定文件夹。

目前我使用这样的 indy 函数。我怎样才能用 ICS 做同样的事情?

function exista_textul_in_stringlist(const stringul_pe_care_il_caut:string; stringlistul_in_care_efectuez_cautarea:Tstringlist):boolean;

begin
if stringlistul_in_care_efectuez_cautarea.IndexOf(stringul_pe_care_il_caut) = -1 then
begin
result:=false;
//showmessage('Textul "'+text+'" nu exista!' );
end
else
begin

result:=true;
//showmessage('Textul "'+text+'" exista la pozitia '+ inttostr(ListBox.Items.IndexOf(text)));
end;
end;

function folder_exists_in_ftp(folder_name_to_search_for,ftp_hostname,ftp_port,ftp_username,ftp_password,ftp_root_folder:string;memo_loguri:Tmemo):boolean;
Var
DirList : TStringList;
ftp:Tidftp;
antifreeze:TidAntifreeze;
var i,k:integer;
begin
dateseparator:='-';
Result := False;
DirList := TStringList.Create;
ftp:=tidftp.Create;
antifreeze:=TidAntifreeze.Create;
try
antifreeze.Active:=true;
ftp.Host:=ftp_hostname;
ftp.Port:=strtoint(ftp_port);
ftp.username:=ftp_username;
ftp.password:=ftp_password;
ftp.Passive:=true;
ftp.Connect;

ftp.ChangeDir(ftp_root_folder);
ftp.List(DirList, folder_name_to_search_for, True);


if DirList.Count > 0 then begin
k := DirList.Count;
DirList.Clear; // DIRLIST will hold folders only
for i := 0 to k - 1 do begin
if (ftp.DirectoryListing.Items[i].FileName <> '.') and (ftp.DirectoryListing.Items[i].FileName <> '..') then begin
if ftp.DirectoryListing.Items[i].ItemType = ditDirectory then begin
DirList.Add(ftp.DirectoryListing.Items[i].FileName);
end;
end;
end;
end;
if exista_textul_in_stringlist(folder_name_to_search_for,DIRLIST) then
begin
Result := True;
memo_loguri.Lines.Add(datetimetostr(now)+' - caut folderul "'+folder_name_to_search_for+'" in directorul ftp "'+ftp_root_folder+'" => EXISTS!');
end

ELSE
begin
result:=false;
memo_loguri.Lines.Add(datetimetostr(now)+' - caut folderul "'+folder_name_to_search_for+'" in directorul ftp "'+ftp_root_folder+'" => NOT exists!');
end;
finally
ftp.Free;
antifreeze.Free;
DirList.Free;
end;

end;

最佳答案

我假设您使用的是最新发布的OverbyteIcs (ICS-V8.16 (Apr, 2015))版本.

如果您只需要检查远程目录是否存在,则另一个答案中提到的一个很好的建议是避免使用列表(如果返回大量文件和文件夹,这可能是一项耗时的操作)。

我建议您尝试“乐观”并使用FTP.Cwd更改为您想要调查的远程目录。如果此调用返回 true,则该文件夹当然存在,并且如果您打算继续使用同一客户端,则必须更改回原始目录。另一方面,如果调用失败,如果 ftp 服务器响应代码 550,则该目录不存在。

我已经包含了一个执行上述操作的简单示例(但是,它不提供“成功时更改回原始目录”功能):

uses
...
OverbyteIcsFtpCli;

function FtpRemoteDirExists(
HostName: String;
UserName: String;
Password: String;
HostDirToCheck : String ) : Boolean;
const
cFtpCode_FileOrDirNotExists = 550;
var
FTP: TFtpClient;
begin
FTP := TFtpClient.Create(nil);
try
FTP.HostName := HostName;
FTP.Passive := True;
FTP.Binary := True;
FTP.Username := UserName;
FTP.Password := Password;
FTP.Port := '21';

if not FTP.Open then
raise Exception.Create('Failed to connect: ' + FTP.ErrorMessage);

if (not FTP.User) or (not FTP.Pass) then
raise Exception.Create('Failed to login: ' + FTP.ErrorMessage);

FTP.HostDirName := HostDirToCheck;
if FTP.Cwd then
Result := True
else
begin
if FTP.StatusCode = cFtpCode_FileOrDirNotExists then
Result := False
else
raise Exception.Create('Failed to change dir: ' + FTP.ErrorMessage);
end;

finally
FTP.Free;
end;
end;

关于delphi - ICS FTP - 检查 ftp 服务器上是否存在文件夹的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577717/

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