Jak pobrać wielkość pliku w sieci

0

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?

0

Już wiem :) Odpowiedź dla zainteresowanych. Istnieje funkacja HttpQueryInfo która z wywołana z paremetrem HTTP_QUERY_CONTENT_LENGTH zwraca wielkosć pliku.

        var 
           Buffer: Pointer;
           dwBufLen, dwReserved, fFileSize:Dword;
        //Ciach
        dwBufLen:= 1024;
        dwReserved:= 0;
        GetMem(Buffer, dwBufLen);
        //fService zwraca funkcja InternetOpenUrl
        if HttpQueryInfo(fService, HTTP_QUERY_CONTENT_LENGTH, Buffer, dwBufLen ,dwReserved) then
          fFileSize:= StrToIntDef(StrPas(Buffer), -1);
        FreeMem(Buffer);
        //Ciach

1 użytkowników online, w tym zalogowanych: 0, gości: 1