下了一個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這個程序該如何使用?
uj5u.com熱心網友回復:
關于檔案名重名是因為SendCmd呼叫GetResponse時被阻塞,因此直接呼叫WriteLn,可避免問題1發生,那么問題2如何解決?似乎哪里也出現了阻塞?uj5u.com熱心網友回復:
果然是沒有通過ASender回傳狀態,以至于客戶端等待回執死機,問題2的解決方式是在MoveFile成功以后,呼叫ASender.Connection.WriteLn('200 OK');通過回應代碼200告知客戶端修改成功,這時候,資源管理器修改檔案名會立即成功。因此OnRenameFile里面,無論操作是否成功還是失敗,都是必須要通過ASender來回執客戶端資訊。uj5u.com熱心網友回復:
又有問題了:1、如果不允許洗掉檔案,資源管理器會提示拒絕洗掉,但是提示完畢后,不能再繼續使用了,資源管理器報告250,200錯誤。
2、如果不允許新建檔案夾,不允許上傳檔案,錯誤情況同上。
請問是何種原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/107268.html
標籤:網絡通信/分布式開發
下一篇:delphi關于串口通信報錯問題
