線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2383
推到 Plurk!
推到 Facebook!

关于FTP的STOREFILE?

尚未結案
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-22 08:34:23 IP:221.226.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-22 16:55:44 IP:203.69.xxx.xxx 未訂閱
根據 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-22 20:08:16 IP:221.226.xxx.xxx 未訂閱
谢谢您的提点~  只是很奇怪很多例程都有那句,所以就搞不清楚了。但测试有它没它确没任何影响,说也奇怪,既然无作用怎么那么多例程都会加上那句呢? 另外再请教一个问题,就是当服务器传输过大量数据后,在关闭程序时尽然会出现非法操作,如果在 >
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-23 08:15:00 IP:203.69.xxx.xxx 未訂閱
有這段代碼可能是 Indy 版本的問題, 我是用 Indy 9 的 source code 去看 找了一下 http://delphi.ktop.com.tw/topic.php?topic_id=61293 這篇也是同樣狀況 "非法操作"?! 原始錯誤訊息可否列出來?
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-23 23:11:41 IP:221.226.xxx.xxx 未訂閱
非法操作实在没法列出来,因为在9X下就直接蓝屏,在NT/2000/XP就弹出应用程序非法操作。    我尝试写了一个最简单的INDY 的 FTP 服务器程序,什么都没就LIST/STORE/CHANGEDIR,结果上传很多文件后,退出服务器也就是ACTIVE:=FALSE时又非法操作了。    但可以保证的是我关闭服务器程序时所有传输已经结束,客户端也退出了,奇怪的是还是有非法操作,我试过用ICS的FTP控件没有这个问题,但我做的项目进度过70%,要想重新更换元件,估计老板会杀了我的~ P:
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-24 08:40:40 IP:203.69.xxx.xxx 未訂閱
我的意思是 能不能請 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-24 15:00:12 IP:221.226.xxx.xxx 未訂閱
感谢 malanlk 兄的帮助,感激不尽。    目前来说因为它导致的是直接DONE机,DELPHI也自动关闭了,所以没法去截屏,站上的其它大大的范例也看过了,我跑了一下大量测试,关闭时问题同我的一样,但小量文件却无关系。    在这段时间的研究发现,包括INDY客户端也有很多技巧,就拿INDY做的DEMO来说,如果您CHANGEDIR到一个不存在的目录,你在回来时就发现客户端已经同断线无异,在之前需要一定的处理。    我想估计SERVER也同样吧~    最后再次感谢 malanlk 兄的帮助~
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-24 17:01:57 IP:203.69.xxx.xxx 未訂閱
可以考慮用 Indy10, 許多 Indy9 上的問題 都是結構上造成的, 為此 Indy10 大量調整了不少結構, 我也用了一段時間, 也還OK. 只是還沒試過 FTP Server 部份, 也許 Vicen 兄有機會可以試試...只是剛開始時是會遇到ㄧ堆 property 不見了, 不過了解後也倒容易解決 http://bdn.borland.com/borcon2004/article/paper/0,1963,32160,00.html 這篇可以參考一下.
Vicen
高階會員


發表:13
回覆:145
積分:151
註冊:2005-03-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-25 09:05:34 IP:221.226.xxx.xxx 未訂閱
感谢 malanlk, 不过我实在无意在去更换控件,INDY 10虽然强大,但一个新产品的诞生,新功能总伴随新的BUG, 我已经被INDY 9搞的焦头烂额,修改了很多源码,有的改不了的就设法绕过,这个消耗了太多的精力。    现在公司已经不允许再用第三方控件,因为早前使用的VCLSKIN出现内存泄漏,搞的我们查了半天......    
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-04-26 13:50:34 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-11-22 23:30:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!