gpt4 book ai didi

delphi - IDFTP DirExists 和 MakeDir

转载 作者:行者123 更新时间:2023-12-03 15:23:22 27 4
gpt4 key购买 nike

我正在使用 Indy IDFTP 来创建目录。我需要找到一种可靠的方法来确定目录是否存在,如果不存在,则调用 MakeDir。我尝试了以下代码,但是调用 List 时没有发生异常,因此即使当时目录不存在,MakeDir 也没有执行。如何判断一个目录是否存在,如果不存在则创建该目录?

{ Check to see if the '/public_html/XXX/' + iDomain + 'Thumbnails' directory exists }
try
IdFTP1.List(nil, '/public_html/XXX/' + iDomain + 'Thumbnails', False);
except
on e: EIdReplyRFCError do
begin
{ '/public_html/XXX/' + iDomain + 'Thumbnails' directory does not exist }
StatusBar1.SimpleText := 'Making thumbnail directory...';
StatusBar1.Update;
iFolder := '/public_html/XXX/' + iDomain;
{ Change directory to /public_html/XXX/iDomain }
IdFTP1.ChangeDir(iFolder);
iFolder := 'Thumbnails';
{ Create FTP Directory for Thumbnails }
IdFTP1.MakeDir(iFolder);
end;
end;

在我的测试过程中,该目录不存在,但在运行时 e 为零?我的做法正确吗?

最佳答案

如果 TIdFTP.List() 没有引发异常,则 FTP 服务器很可能返回 450 回复代码,这仅意味着“未执行请求的文件操作” ”。 TIdFTP.InternalGet()(由 TIdFTP.List()TIdFTP.ExtListDir()TIdFTP.Get 使用()) 不会将 450 视为错误条件,因为某些服务器(如 Ericsson Switch FTP)在列出空的内容时发送 450,但在其他情况下存在目录,因此没有要发送的列表数据。不过,当请求的目录不存在时,某些服务器确实会发送450TIdFTP.List() 不会尝试区分。但是,如果 TIdFTP.List() 未引发异常,您可以查看 TIdFTP.LastCmdResult 属性,以便在需要时手动区分。

此外,您不能仅仅依赖引发异常的事实来表示该文件夹不存在。可能会发生任意数量的错误。您必须实际查看错误并采取相应措施,例如:

var
Exists: Boolean;

try
IdFTP1.List(nil, '/public_html/XXX/' + iDomain + 'Thumbnails', False);
Exists := True;
if IdFTP1.LastCmdResult.NumericCode = 450 then
begin
if (IdFTP1.LastCmdResult.Text.Text has a message like 'No such file or directory' or similar) then begin
Exists := False;
end;
// look for other possible text messages...
end;
except
on e: EIdReplyRFCError do
begin
if (e.ErrorCode <> 550) or (e.Message does not have a message like 'Directory not found' or similar) then begin
raise;
end;
Exists := false;
end;
end;

if not Exists then
begin
{ '/public_html/XXX/' + iDomain + 'Thumbnails' directory does not exist }
StatusBar1.SimpleText := 'Making thumbnail directory...';
StatusBar1.Update;
iFolder := '/public_html/XXX/' + iDomain;
{ Change directory to /public_html/XXX/iDomain }
IdFTP1.ChangeDir(iFolder);
iFolder := 'Thumbnails';
{ Create FTP Directory for Thumbnails }
IdFTP1.MakeDir(iFolder);
end;

更好的方法是:

  1. ChangeDir()直接到目标目录,看看是否失败。如果是这样,则开始向后遍历路径,为每个父目录调用 ChangeDir() 直到最后成功,然后使用 MakeDir() 沿路径返回>ChangeDir() 根据需要创建缺少的子目录。

  2. 从路径中的第一个目录开始,对其进行 ChangeDir() 操作,然后使用 List() 查看下一个子文件夹是否存在,如果需要,MakeDir() 它,然后 ChangeDir() 到它,并根据需要重复,直到到达目标目录。

欢迎使用FTP。它不是一个非常有效的目录管理协议(protocol)。

关于delphi - IDFTP DirExists 和 MakeDir,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27955141/

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