关于FTP的STOREFILE? |
尚未結案
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
procedure TFrmMain.IdFTPServerStoreFile(ASender: TIdFTPServerThread; const AFileName: string; AAppend: Boolean; var VStream: TStream); var tarFileName: String; begin tarFileName := StrGetRealPathName(TFTPClient(ASender.Data).RootPath,ASender.CurrentDir,AFilename); ReplaceString(tarFileName, '/', '\', False); RecodeFtpLog(Format('User : %s Store File "%s"', [ASender.Username, tarFileName])); if AAppend then begin VStream := TFileStream.Create(tarFileName, fmOpenWrite or fmShareExclusive); VStream.Seek(0, soFromEnd); end else begin VStream := TFileStream.Create(tarFileName, fmCreate or fmOpenReadWrite); VStream.Position := 0; end; ASender.Connection.ReadStream(VStream, VStream.Size, False); end;代码是阅读站上一位大大的,但最后的那句(红色那句)不知道作用是什么?我注释后运行也一样正常,哪位大大知道,请指点一下,不尽感恩~ |
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
根據 Help 解釋 這段程式碼是 Server 端接到 Client 端 FTP STOR, STOU, or APPE 的指令時, 必須準備好Stream去接收Client端檔案並寫入Server端. 以下是 IdFTPServer.pas 的片段
procedure TIdFTPServer.CommandSSAP(ASender: TIdCommand); var LStream: TStream; LTmp1: string; LAppend: Boolean; Reply: TIdRFCReply; begin .... if Assigned(FOnStoreFile) then begin LStream := nil; FOnStoreFile(TIdFTPServerThread(ASender.Thread), LTmp1, LAppend, LStream); if Assigned(LStream) then begin //Issued previously by ALLO cmd if FALLOSize > 0 then begin LStream.Size := FALLOSize; end; if LAppend then begin LStream.Position := LStream.Size; end else begin LStream.Position := FRESTPos; FRESTPos:=0; end; { Data transfer } try Reply := TIdRFCReply.Create(nil); FDataChannelThread.Data := LStream; FDataChannelThread.OKReply.SetReply(226, RSFTPDataConnClosed); FDataChannelThread.ErrorReply.SetReply(426, RSFTPDataConnClosedAbnormally); ASender.Reply.SetReply(150, RSFTPDataConnToOpen); ASender.SendReply; FDataChannelThread.StartThread(ftpStor); finally FreeAndNil(Reply); end; end else begin ASender.Reply.SetReply(550, RSFTPFileActionAborted); end; end else begin ASender.Reply.SetReply(550, Format(RSFTPCmdNotImplemented, [ASender.CommandHandler.Command])); end; end; end; end;由 source code 來看 要到紅色那行才會開始傳資料 所以ASender.Connection.ReadStream .... 那行看起來好像沒用, 因為資料還沒開始傳, 所以 buffer 內是空的, 讀不到資料結論是什麼也沒做. |
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
非法操作实在没法列出来,因为在9X下就直接蓝屏,在NT/2000/XP就弹出应用程序非法操作。 我尝试写了一个最简单的INDY 的 FTP 服务器程序,什么都没就LIST/STORE/CHANGEDIR,结果上传很多文件后,退出服务器也就是ACTIVE:=FALSE时又非法操作了。 但可以保证的是我关闭服务器程序时所有传输已经结束,客户端也退出了,奇怪的是还是有非法操作,我试过用ICS的FTP控件没有这个问题,但我做的项目进度过70%,要想重新更换元件,估计老板会杀了我的~ P:
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
我的意思是 能不能請 Vicen 兄, Debug 一下是否有錯誤訊息,
像
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=45270
最後 iopassi 所發問的問題一樣 如果是這樣 就在 Active := False 用 tyr...except 包起來
可參考這篇的說法(Indy 9 的 Help)
http://www.atari-source.com/docs/indy/9.0/html/000360.html 如果不是, 可否請 Vicen 兄列出 Debug 錯誤訊息.....
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
|
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |