Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > размер файла в интернете


Автор: Driv3r 27.4.2006, 19:01
Нужно узнать размер файла находящегося по заданному URL.Использую InternetQueryDataAvailable .Размер небольших файлов определяет точно,но если размер файла за 100кб начинаются серьёзные погрешности.Как быть? 

Автор: Демо 28.4.2006, 09:29
Цитата(Driv3r @  27.4.2006,  19:01 Найти цитируемый пост)
Как быть? 


Видимо, приводить код, который используешь?
Иначе можно сразу сказать, что ошибка в 17-й строке. 

Автор: Driv3r 28.4.2006, 15:22
Вроде этого:
Код

var
url:HInternet;
Razmer:dword;
begin
InternetQueryDataAvailable(url, Razmer,0,0);
 

Автор: RaIDeR 30.4.2006, 11:55
Попробуй так:
Код

function GetInetFileSize(const Host, FileName: String) : Integer;
const
  ContentLength = 'Content-Length';

var
  Buf: String;
  BufLen, dw: DWORD;
  hInet, hConnect, hRequest: HINTERNET;
begin
  Result := - 1;
  hInet := InternetOpen(nil, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if hInet <> nil then
    try
      hConnect := InternetConnect(hInet, PChar(Host), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
      if hConnect <> nil then
        try
          hRequest := HttpOpenRequest(hConnect, nil, PChar(FileName), nil, nil, nil, 0, 0);
          if hRequest <> nil then
            try
              Buf := 'Range: bytes=0-' + #13#10 + 'Referer: ' + Host + #13#10 + 'Host: ' + Host;
              if HttpSendRequest(hRequest, PChar(Buf), Length(Buf), nil, 0) then
              begin
                dw := 0; Buf := ''; BufLen := 0;

                while not HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, PChar(Buf), BufLen, dw) do
                  SetLength(Buf, BufLen);

                if (Pos('HTTP/1.0 206', Buf) <> 0) or (Pos('HTTP/1.1 206', Buf) <> 0) then
                  if Pos(ContentLength, Buf) <> 0 then
                  begin
                    Delete(Buf, 1, Pos(ContentLength, Buf) + Length(ContentLength));
                    Result := StrToInt(Copy(Buf, 1, Pos(#13, Buf) - 1));
                  end;
              end;
            finally
              InternetCloseHandle(hRequest);
            end;
        finally
          InternetCloseHandle(hConnect);
        end;
    finally
      InternetCloseHandle(hInet);
    end;
end;

Использование ф-ции:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  FileSize: Integer;
begin
  FileSize := GetInetFileSize('127.0.0.1', '/test.rar');
  if FileSize = - 1 then
    ShowMessage('А может нет такого файла, а ? =)')
  else
    ShowMessage(IntToStr(FileSize));
end;
 

Автор: djmix777 25.7.2006, 13:46
у меня дельфи 5 - ый, не получается по вышеприведённым примерам получить размер файла из инета
перед скачиванием

помогите плз! 

Автор: Matematik 25.7.2006, 17:53
Цитата(djmix777 @  25.7.2006,  14:46 Найти цитируемый пост)
у меня дельфи 5 - ый, не получается по вышеприведённым примерам получить размер файла из инетаперед скачиваниемпомогите плз! 

Телепаты в отпуске.
Пример работает. Что конкретно не получается? 

Автор: Poseidon 25.7.2006, 18:40
Эх... люблю я Indy ^)

Код
uses IdHTTP;

function GetInetFileSize(const FileUrl:string):integer;
var idHTTP: TidHTTP;
begin
  Result:=0;
  idHTTP:=TIdHTTP.Create(nil);
  idHTTP.Head(FileUrl);
  Result:=idHTTP.Response.ContentLength;
  IdHTTP.Free;
end; 
 

Автор: djmix777 26.7.2006, 05:43
Matematik, да я в курсе что телепаты н заслуженном  отдыхе, дело в том что
примерчик то вроде работет, компилится,

а я просто не могу придумать как с 

Код

FileSize := GetInetFileSize('127.0.0.1', '/test.rar');


тут бы было хорошо чтобы просто по ссылке определял размер, а то ip определять и прочее, не очень то!


Poseidon, а с Indy как бы сделать чтобы мне на 5 установить
а то ведь обламываюсь, все пишут а я ничего сделать не могу smile


помогите адаптировать мне мой 5 дельфи, или помогите плиз с доступным кодом для 5 дельфи


Спасибо!!!

Добавлено @ 05:45 
Matematik, да я в курсе что телепаты н заслуженном  отдыхе, дело в том что
примерчик то вроде работет, компилится,

а я просто не могу придумать как с 

Код

FileSize := GetInetFileSize('127.0.0.1', '/test.rar');


тут бы было хорошо чтобы просто по ссылке определял размер, а то ip определять и прочее, не очень то!


Poseidon, а с Indy как бы сделать чтобы мне на 5 установить
а то ведь обламываюсь, все пишут а я ничего сделать не могу smile


помогите адаптировать мне мой 5 дельфи, или помогите плиз с доступным кодом для 5 дельфи


Спасибо!!! 

Автор: Matematik 26.7.2006, 13:35
Автоматический установщик Indy http://www.atozed.com/indy/plus/files.aspx

Код

procedure GetInetFileSize_(URL:String);
var
  FileSize: Integer;
  host,fil: String;
  p : Integer;
begin
  host := '';
  fil  := '';
  p := pos('://', URL);
  if p>0 then
    Delete(URL,1,p+2);
  p := pos('/', URL);
  if p>0 then
  begin
    fil  := copy(URL,p,maxint);
    Host := copy(URL,1,p-1)
  end
         else
  begin
    fil  := '/';
    Host := URL
  end;
  FileSize := GetInetFileSize(Host, fil);
  if FileSize = - 1 then
    ShowMessage('А может нет такого файла, а ? =)')
  else
    ShowMessage(IntToStr(FileSize));
end;

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)