Bil*_*ill 4 delphi indy10 delphi-xe7
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
在我测试期间,目录不存在,但在运行时e是零?我的方法是否正确?
如果TIdFTP.List()
没有引发异常,FTP服务器很可能返回一个450
回复代码,这意味着"未采取请求的文件操作". TIdFTP.InternalGet()
(由TIdFTP.List()
,TIdFTP.ExtListDir()
和使用TIdFTP.Get()
)不会被450
视为错误条件,因为某些服务器(如爱立信交换机FTP)450
在列出空的但存在的目录的内容时发送,因此没有要发送的列表数据.但是,450
当请求的目录不存在时,某些服务器会发送. TIdFTP.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;
Run Code Online (Sandbox Code Playgroud)
更好的方法是:
ChangeDir()
直接到目标目录,看它是否失败.如果是这样,则开始向后遍历路径,调用ChangeDir()
每个父目录,直到最终成功,然后使用MakeDir()
和向前走回路径并ChangeDir()
根据需要创建缺少的子目录.
从路径中的第一个目录开始ChangeDir()
,然后List()
查看是否存在下一个子文件夹,MakeDir()
如果需要,则查看是否存在,然后根据需要ChangeDir()
重复,直到到达目标目录.
欢迎使用FTP.它不是一个非常有效的目录管理协议.
归档时间: |
|
查看次数: |
9023 次 |
最近记录: |