好奇怪的问题。只要能回答,分数不是问题(20分)

  • 主题发起人 主题发起人 yyok
  • 开始时间 开始时间
Y

yyok

Unregistered / Unconfirmed
GUEST, unregistred user!
我用InternetReadFileEx从网上读取文件,
读得不会停下了,也就是文件读完了,但是dwBufferLength不会返回0,
我设的缓冲大小为65535,但是我把它设得很小时,比如4,就不会发生这个问题。
请问这是为什么。
bAllDone := false;
iTotalReceive := 0 ;
iFileHandle := FileCreate('C:/temp.exe');
if iFileHandle = -1 then ShowMessage(IntToStr(GetLastError()));


repeat
begin
FillMemory(@InetReadBuf,sizeof(InetReadBuf),0);
InetReadBuf.dwStructSize := sizeof(InetReadBuf);
InetReadBuf.lpvBuffer := @readBuf;
InetReadBuf.dwBufferLength := 65535;
bRetReadFile := InternetReadFileEx
(hRequest,@InetReadBuf,IRF_ASYNC,2);
if bRetReadFile = false then
begin
if GetLastError() <> ERROR_IO_PENDING then
begin
Form1.OutPut(GetLastError(),'interReadFile fail');
break;
end;

end;
filewrite(iFileHandle,readBuf,InetReadBuf.dwBufferLength);
if InetReadBuf.dwBufferLength = 0 then
bAllDone := true;

end
until bAllDone = true;

fileClose(iFileHandle);
 
看看MSDN吧!
 
MSDN上没有详细的说明
 
if InetReadBuf.dwBufferLength = 0 then
bAllDone := true;
你的这句语句作为退出读文件的依据,但是你的程序对dwBufferLength是赋值的,而不是读取时处理的,dwBufferLength当然一直是你赋值的这个值了,至于你给dwBufferLength一个很小的值,是缓冲区太小,读取错误退出的缘故
 
不是这个原因,实际读取了多少会重新设置InetReadBuf.dwBufferLength这个值的。
当这个值为0时就读完了。因为我用internetreadfile是这个样子的。
 
那你用的操作系统是什么,你试试65535减少一半试试看,是不是缓冲区开得过大会溢出
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部