delphi – IDFTP DirExists和MakeDir
发布时间:2020-12-15 09:21:11 所属栏目:大数据 来源:网络整理
导读:我正在使用Indy IDFTP来创建目录.我需要找到一种可靠的方法来确定目录是否存在以及它是否存在,以便调用MakeDir.我尝试了以下代码,但是在调用List时没有发生异常,因此即使当时目录不存在,MakeDir也没有执行.如何确定目录是否存在并创建目录(如果该目录不存在)
我正在使用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视为错误条件,因为某些服务器(如爱立信交换机FTP)发送450时列出一个空的但存在的目录的内容,因此没有要发送的列表数据.但是,当请求的目录不存在时,某些服务器会发送450. TIdFTP.List()不会尝试区分.但是,如果TIdFTP.List()未引发异常,则可以查看TIdFTP.LastCmdResult属性以在需要时手动区分.
此外,您不能仅仅依赖于引发异常以表示该文件夹不存在的事实.可能发生任何数量的可能错误.您必须实际查看错误并采取相应措施,例如: var Exists: Boolean; try IdFTP1.List(nil,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; 更好的方法是: > ChangeDir()直接到目标目录,看它是否失败.如果是这样,则开始向后遍历路径,为每个父目录调用ChangeDir(),直到最终成功,然后使用MakeDir()和ChangeDir()返回路径以根据需要创建缺少的子目录. 欢迎使用FTP.它不是一个非常有效的目录管理协议. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |