GARANTIR DESCONTO

Fórum function GetInetFile[Dúvida] ! #363858

12/09/2008

0

Olá galera estou com uma dúvida no seguinte código...
function GetInetFile (const fileURL, FileName: String): boolean; const BufferSize = 1024;
var
hSession, hURL: HInternet; Buffer: array[1..BufferSize] of Byte; BufferLen: Cardinal ; f: File; sAppName: string;
begin
   Result:=False;
   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;

gostaria de saber o seguinte
InternetReadFile(hURL, @Buffer,SizeOf(Buffer), BufferLen); BlockWrite(f, Buffer, BufferLen)


essa parte me intriga...pq declarar BufferSize armazenando 1024 ?
aquelas variáveis do tipo array de Bytes armazenam oq ? oq são esses 1024 ?? e qt a função BlockWrite...pra que serve ?
quem puder ajudar fico mto grato !
vlw abraços !


Psyjacko

Psyjacko

Responder

Posts

14/09/2008

Psyjacko

up up up !


Responder

Gostei + 0

14/09/2008

Discorpio

Bom dia Psyjacko.

Esta função está funcionando :?:

Pergunto isto, porque creio que a sintaxe de sua declaração está errada.

Na verdade BufferSize é um parâmetro opcional, que é recebido dentro da função e não fora dela, assim:


// Errado
  function GetInetFile (const fileURL, FileName: String): boolean; const BufferSize = 1024;

//Certo
  function GetInetFile (const fileURL, FileName: String; const BufferSize = 1024): boolean;



O parâmetro BufferSize é opcional, ou seja, como ele foi definido com um valor inicial = 1024, isto significa dizer que voce ao invocar a função, poderá omitir o valor desse parâmetro, assim:


  if InternetReadFile(hURL, @Buffer) then .......
 


Neste caso, o array de bytes dentro da função ficará dimensionado de 1 a 1024, porém se voce invocar a função assim.


 if InternetReadFile(hURL, @Buffer, SizeOf(Buffer)) then ......



Neste caso, voce passa o tamanho do Buffer (SizeOf(Buffer)) ao parâmetro opcional, então o array de Bytes ficará dimensionado de 1 até o tamanho do buffer passado (SizeOf(Buffer));

Quanto a função, o porque não dizer procedure BlockWrite, eu não sei como a mesma está implementada, mas acredito que a mesma faça escrita de blocos de bytes em memória (armazenando uma página web), só que não sei o certo se é isto mesmo.


Responder

Gostei + 0

15/09/2008

Psyjacko

Amigo, essa função estou ultilizando em uma console application , ela não precisa de cabeçalho por isso não dá erro ! rs
eu tenho dúvidas quanto as functions que são usadas...principalmente
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen); BlockWrite(f, Buffer, BufferLen)


não entendo pq desse valor atribuído a Buffer e esse loop...o loop eu entendo que está baixando o arquivo...já o BlockWrite está escrevendo ele no HD seria isso ? mas quanto as valor 1024 atribuído a constante eu não entendí mesmo...

obrigado pela atenção !


Responder

Gostei + 0

15/09/2008

Discorpio

Boa noite Psyjacko.

Me desculpe, eu confundi a função GetInetFile com InternetReadFile, uma coisa não tem nada a haver com a outra.

Quanto a sua função GetInetFile, ela esta correta, ela está definida assim:

  function GetInetFile (const fileURL, FileName: String): boolean; 
  const BufferSize = 1024;
  var
    hSession, hURL: HInternet; Buffer: array[1..BufferSize] of Byte;
    BufferLen: Cardinal ; f: File; sAppName: string;
  Begin
    ....
    .... 
  end;


Agora assisti razão a você o porque da constante BufferSize estar declarada dentro do escopo da função, só para delimitar o Array de Bytes Buffer, ele poderia ser declarado diretamente com o valor delimitado em 1024, assim:

  function GetInetFile (const fileURL, FileName: String): boolean; 
  var
    hSession, hURL: HInternet; Buffer: array[1..1024] of Byte;
    BufferLen: Cardinal ; f: File; sAppName: string;
  Begin
    ....
    .... 
  end;


Quanto a função InternetReadFile, está função é geralmente utilizada para baixar o arquivo, enquanto que BlockWrite e destinada para gravar os dados de registro do buffer em um arquivo binário, dai o array de bytes de nome Buffer que é passado para esta função (BlockWrite(f, Buffer, BufferLen)), acredito que seja para salvar o arquivo no HD.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar