我从第三方网站获取了以下源代码,它解释了如何使用WinInet从互联网下载文件。我对API不太熟悉,我看了一下WinInet单元,但没有看到像我需要的API调用。
我的目标是添加报告下载进度的功能。我已经在一个TThread中包装了这个过程,一切都很顺利。然而,只有一个缺失的部分:在下载之前找到源文件的总大小。
请看下面我有一个注释 "//HOW TO GET TOTAL SIZE?"。这是我需要在开始下载之前找出文件的总大小的地方。我该怎么做?因为这段代码似乎直到下载完成后才知道文件的大小,这使得这个补充无关紧要。
我的目标是添加报告下载进度的功能。我已经在一个TThread中包装了这个过程,一切都很顺利。然而,只有一个缺失的部分:在下载之前找到源文件的总大小。
请看下面我有一个注释 "//HOW TO GET TOTAL SIZE?"。这是我需要在开始下载之前找出文件的总大小的地方。我该怎么做?因为这段代码似乎直到下载完成后才知道文件的大小,这使得这个补充无关紧要。
procedure TInetThread.Execute;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
S: Bool;
D: Integer;
T: Integer;
procedure DoWork(const Amt: Integer);
begin
if assigned(FOnWork) then
FOnWork(Self, FSource, FDest, Amt, T);
end;
begin
S:= False;
try
try
if not DirectoryExists(ExtractFilePath(FDest)) then begin
ForceDirectories(ExtractFilePath(FDest));
end;
hSession:= InternetOpen(PChar(FAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL:= InternetOpenURL(hSession, PChar(FSource), nil, 0, 0, 0);
try
AssignFile(f, FDest);
Rewrite(f, 1);
T:= 0; //HOW TO GET TOTAL SIZE?
D:= 0;
DoWork(D);
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen);
D:= D + BufferLen;
DoWork(D);
until BufferLen = 0;
CloseFile(f);
S:= True;
finally
InternetCloseHandle(hURL);
end
finally
InternetCloseHandle(hSession);
end;
except
on e: exception do begin
S:= False;
end;
end;
finally
if assigned(FOnComplete) then
FOnComplete(Self, FSource, FDest, S);
end;
end;