Fórum function GetInetFile[Dúvida] ! #363858
12/09/2008
0
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
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
Curtir tópico
+ 0Posts
14/09/2008
Psyjacko
Gostei + 0
14/09/2008
Discorpio
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.
Gostei + 0
15/09/2008
Psyjacko
eu tenho dúvidas quanto as functions que são usadas...principalmente
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 !
Gostei + 0
15/09/2008
Discorpio
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)