下了一个TFTPServer封装IdFTPServer的类,IdFTPServer的OnReNameFile过程里面可传回的参数估计只有ASender,这个过程目前我在Delphi7+Win7下无法使用,代码如下(自己还加了一部分)
procedure TFTPServer.IdFTPServer1RenameFile( ASender: TIdFTPServerThread;
  const ARenameFromFile, ARenameToFile: string ) ;
var
  AFrom,ATo,Cur:string;
  Attri:Integer;
begin
//  ASender.Connection.SendCmd('500 拒绝修改');
//  exit;
  AFrom :=ARenameFromFile;
  ATo :=ARenameToFile;
  if (ASender.CurrentDir<>'/') and (Length(ASender.CurrentDir)>0) then
  begin
    Cur :=ASender.CurrentDir;
    if Cur[Length(Cur)]<>'/' then Cur :=Cur+'/';
    AFrom :=Cur+AFrom;
    ATo :=Cur+ATo;
  end;
  //检查是否重复
  Attri :=FileGetAttr(TransLatePath( AFrom, ASender.HomeDir ));
  if Attri<>-1 then
  begin
    ASender.Connection.SendCmd('553 文件(夹)名称重复');
    exit;
  end;
  try
    if not MoveFile( pchar( TransLatePath( AFrom, ASender.HomeDir ) ) , pchar( TransLatePath( ATo, ASender.HomeDir ) ) ) then
      RaiseLastOSError;
  except
    on e:Exception do
    begin
      if Assigned(FOnFtpNotifyEvent) then
        OnFtpNotifyEvent(Now, ASender.Connection.Socket.Binding.PeerIP,'重命名文件[' + Utf8ToAnsi(AFrom) + ']失败,原因是' + e.Message);
      Exit;
    end;
  end;
  if Assigned(FOnFtpNotifyEvent) then
    OnFtpNotifyEvent(Now, ASender.Connection.Socket.Binding.PeerIP,'重命名文件[' + Utf8ToAnsi(AFrom) + ']为[' + Utf8ToAnsi(ATo) + ']');
end;
问题如下:
1、源代码在重新命名文件(夹)时,如果出现重复名,需要自己检测是否重复,否则出错,第一次是正常的,但是从第二次开始,重名时资源管理器死机,等待一段时间后,程序报告SOCKET ERROR #10093错误,这个时候资源管理器才会正确提示文件名重复无法修改。
2、如果修改文件(夹)名称不重复,实际上修改名称会立即成功,但是这时资源管理器死机,等待一段时间后,程序报告OCKET ERROR #10093错误,这时候资源管理器提示无操作权限失败(实际成功了),刷新一下资源管理器,新名称会显示。
请问OnRenameFile这个过程该如何使用?

解决方案 »

  1.   

    关于文件名重名是因为SendCmd调用GetResponse时被阻塞,因此直接调用WriteLn,可避免问题1发生,那么问题2如何解决?似乎哪里也出现了阻塞?
      

  2.   

    果然是没有通过ASender返回状态,以至于客户端等待回执死机,问题2的解决方式是在MoveFile成功以后,调用ASender.Connection.WriteLn('200 OK');通过响应代码200告知客户端修改成功,这时候,资源管理器修改文件名会立即成功。因此OnRenameFile里面,无论操作是否成功还是失败,都是必须要通过ASender来回执客户端信息。