關于流的Copyfrom方法的疑惑----可憐的我只有12分了全給了(12分)

  • 主题发起人 主题发起人 Jelly0228
  • 开始时间 开始时间
J

Jelly0228

Unregistered / Unconfirmed
GUEST, unregistred user!
近來在編寫一個類似TurboNote的局域網通訊軟件﹐用Socket實現。在寫多線程發送文件部分時﹐出現了一個怪怪的問題(把一個流的內容Copy到另外一個流中)一直沒有解決好﹐請大蝦幫忙看看~~
下面是出問題的代碼:
with Form1.OpenDialog1 do
begin
Execute;
if FileName<>'' then
begin
FN:=FileName;
FF:=ExtractFileName(FN);

Form1.ClientSocket1.Host:='172.17.8.205';
Form1.ClientSocket1.Active:=True;

S:=TWinSocketStream.Create(Form1.ClientSocket1.Socket,60000);
// F:=TFileStream.Create(FN,fmOpenRead or fmShareDenyNone);
F:=TFileStream.Create(FN,fmShareDenyWrite);

try
S.CopyFrom(F,0); //問題語句在這兒

finally
S.Free;
F.Free;
Form1.ClientSocket1.Active:=False;
end; //End Try

end; //End if FileName<>'' then
end; //End with Form1.OpenDialog1 do

當我選擇一個小于60KB的文件時﹐這段代碼沒有問題﹔但當我選擇一個大于60KB的文件時﹐就會發生"write stream error"的錯誤﹔值得一提的是﹐如果先選擇了一個小于60KB的文件﹐在不關閉窗口的前提下﹐再繼續選擇一個大于60KB的文件﹐就沒有問題。

不知哪位遇過類似的問題?如何解決??
 
S.CopyFrom(F,0); //問題語句在這兒
这一句你肯定有问题,这样拷贝都是0个字节啊!
不知道你后面为什么会有60K的问题。
不过这样改改:
S.CopyFrom(F, F.Size);
这样应该没有问题了。
 
是不是该f.position:=0?
 
// F:=TFileStream.Create(FN,fmOpenRead or fmShareDenyNone);
F:=TFileStream.Create(FN,fmShareDenyWrite);

try
S.Seek(0,soFromEnd);//===============>加上这句试试
S.CopyFrom(F,0); //問題語句在這兒

finally
S.Free;

S.CopyFrom(F,0); //問題語句在這兒

finally
S.Free;
------略~~~~~~~~~
 
謝謝各位的參與。
zqw0117,當CopyFrom的第二個參數為0的時候﹐即表示Copy所有的字節﹔
落木潇潇,我試過了不行﹔
桦树皮,你那樣也不行﹔
在TStream的Copyfrom方法中﹐我們可以看到﹐流的Copy是按批次進行的﹐每次都Copy64KB﹐如果一個檔案大于64KB那就要進行多次讀寫緩沖操作。
通過跟蹤可以發現﹐引發錯誤的其實是TWinSocketStream的Write方法﹐在 if FEvent.WaitFor(FTimeOut) <> wrSignaled then這行報錯。可惜實在是看不太懂﹗

 
后退
顶部