Piszę programik, który ma pobierać aktualizacje( i nie tylko). Do sciągnięcia plików używam funkcji WinApi: InternetOpen, InternetOpenUrl, InternetReadFile i InternetCloseHandle . Chcę aby były dostępne takie informacje jak prędkość pobierania, szaczowany czas i ProgressBar.No i właśnie aby obliczyc szacowny czas pobieranie i zrobić ProgressBar potrzebna mi jest wielkosć pliku. Czy ktoś zna spodób jak pobrać wielkosć pliku w sieci?
procedure TDownloadThread.Execute;
var
i: integer;
lpBuffer: array[0..1024 + 1] of Char;
dwBytesRead, dwBytesWrite: DWORD;
begin
fIsActive:= True;
if (fSession = nil) then exit; //tu dorobić jakiś komunikat
for i:=0 to fURLList.Count - 1 do
begin
fActualFileSize:= 0;
fFHandle:= CreateFile(PChar(fFileList.Strings[i]), GENERIC_WRITE, 0, nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if fFHandle <> -1 then
begin
fService:= InternetOpenUrl(fSession, PChar(fURLList.Strings[i]), nil, 0,
INTERNET_FLAG_RELOAD, 0);
if Assigned(fService) then
begin
try
while True do
begin
//fTime jest typu real
fTime:= GetTickCount;
dwBytesRead := 1024;
InternetReadFile(fService, @lpBuffer, 1024, dwBytesRead);
if dwBytesRead = 0 then break; //dorobic powiadomienie
WriteFile(fFHandle, lpBuffer, dwBytesRead, dwBytesWrite, nil);
if dwBytesRead <> dwBytesWrite then break; //dorobic powiadomienie
//Jeszcze nie potrzebne bo nie umiem pobrac wielkosci pliku
fActualFileSize:= fActualFileSize + dwBytesRead; //ile pobrano
//ile sekund trwalo pobranie i zapisanie dwBytesRead bajtow
fTime:= 1000 / (GetTickCount - fTime);
//Obliczam predkość pobierania DOBRZE TO W OGÓLE JEST?
fDownloadSpeed:= (fTime * dwBytesRead) / 1024;
Synchronize(UpdateProgress);
end;
finally
InternetCloseHandle(fService);
CloseHandle(fFHandle);
end;
end
else //Blad InternetOpenUrl
begin
CloseHandle(fFHandle);
break; //zrobic obsluge bledow
end;
end
else
begin //Nie udalo sie otworzyc pliku
break; //zrobic obsluge bledow
end;
end;
fIsActive:= False;
end;
Oczywiście InternetOpen
fSession:= InternetOpen('MojProgram', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
i InternetClose też wywołuję tylko w innym miejscu.
InternetCloseHandle(fSession);
Wiem że jest funkcja URLDownloadToFile ale to... bez komentarza bo nie chcę się wyrażać, gdzieś czytałem, że jest też klasa TDownLoadURL całkiem fajna nawet obsługuje ProgressBar ale nie pokazuje prędkości pobierania. :(
Moze ktoś podpowie pobrać wielkość pliku?