Процент скачивания файла[delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by marcos, 4 Feb 2010.

  1. marcos

    marcos New Member

    Joined:
    8 Nov 2009
    Messages:
    111
    Likes Received:
    1
    Reputations:
    -5
    Всем привет! Нашел функцию для скачивания из интернета:
    Code:
    function GetInetFile (const fileURL, FileName: String): boolean;
    const BufferSize = 1024;
    var
      hSession, hURL: HInternet;
      Buffer: array[1..BufferSize] of Byte;
      BufferLen: DWORD;
      f: File;
      sAppName: String;
    begin
      Result:=False;
      sAppName := ExtractFileName(Application.ExeName);
      hSession :=InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      try
        hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
        try
          AssignFile(f, FileName);
          Rewrite(f,1);
          repeat
            InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
            BlockWrite(f, Buffer, BufferLen)
          until BufferLen = 0;
          CloseFile(f);
          Result:=True;
        finally
          InternetCloseHandle(hURL)
        end
      finally
        InternetCloseHandle(hSession)
      end
    end;
    
    Подскажите как доработать его, чтобы он показывал процент скачивание в progressbar?
     
  2. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    557
    Likes Received:
    45
    Reputations:
    0
    вот тебе пример функции из моего модуля. Думаю разберешься, там все еть.

    Code:
    function TApiGetHTTP.Get(const AURL: string; AResponseContent: TStream): boolean;
    const BufferSize = 1024;
    var
      Buffer : array[0..BufferSize] of Byte;
      BufferLen: DWORD;
      Header : string;
      hSession, hConnect, hRequest : hInternet;
      FSize : Int64;
    begin
    { Подготавливаем заголовок }
      If FUserAgent = '' Then FUserAgent := 'Delphi/7.0';
      If FAccept <> '' Then Header := Header + 'Accept: ' + FAccept + #10;
      If FAcceptEncoding <> '' Then Header := Header + 'Accept-Encoding: ' + FAcceptEncoding + #10;
      If FConnection <> '' Then Header := Header + 'Connection: ' + FConnection + #10;
      If FContentType <> '' Then Header := Header + 'Content-Type: ' + FContentType + #10;
      If FKeepAlive <> '' Then Header := Header + 'Keep-Alive: ' + FKeepAlive + #10;
      If FAcceptCharset <> '' Then Header := Header + 'Accept-Charset: ' + FAcceptCharset + #10;
    
      If (FRangeStart <> '') and (FRangeEnd <> '') Then
      begin
        Header := Header + 'Range: bytes=' + FRangeStart + '-' + FRangeEnd;
      end;
    
      // Если есть куки, то приделываем их к заголовку
      If FCookie <> '' Then Header := Header + 'Cookie: ' + FCookie;
    
     hSession := InternetOpen(PChar(FUserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
     hConnect := InternetConnect(hSession, pchar(GetHost(AURL)), 80, nil, nil,
                                 INTERNET_SERVICE_HTTP, 0, 0);
    
     hRequest := HttpOpenRequest(hConnect, PChar('GET'), PChar(Copy(AURL, Pos('.ru', AURL) +4, Length(AURL))), 'HTTP/1.1',
                                 nil, nil, 0, 0);
    
     HttpSendRequest(hRequest, PChar(Header), Length(Header), nil,
                     0);
    
      FSize := GetUrlInfo(HTTP_QUERY_CONTENT_LENGTH, AURL);
      TriggerOnWorkBegin(FSize);
    
     repeat
      Result := InternetReadFile(hRequest, @Buffer,
      SizeOf(Buffer), BufferLen); 
      AResponseContent.Write(Buffer, SizeOf(Buffer));
      TriggerOnWork(AResponseContent.Position);
     until BufferLen = 0;
      InternetCloseHandle(hRequest);
      InternetCloseHandle(hSession);
      TriggerOnWorkEnd(nil);
    end;