下了一个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这个过程该如何使用?
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这个过程该如何使用?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货