Saludos, tenía mucho tiempo que no venía jejeje. Quisiera que por favor me ayudaran con un problema que tengo, especialmente descargando un archivo de Internet. Estoy usando la función
GetInetFile que conseguí de la web About.com, que muchas veces he encontrado la solución a mis problemas allí, aunque tiene un pequeño defecto. Funciona bien excepto: cuando estoy descargando un archivo de Internet y no hay conexión (por ejemplo: si el host no se consigue, o si desconecto el cable ethernet para emular que no hay internet, etc.). A veces me consigo con un archivo de 0kb (que está bien, con eso no hay problema), y a veces me consigo con que se ha quedado llenando el disco duro con un archivo que pesa varios Mb o inclusive varios Gb si me distraigo y no mato el proceso a tiempo. Quisiera que, si no hay internet, no se quedara llenando el disco duro como "a veces" puede pasar.
Código Delphi
[-]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;
countSize: int64;
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) ;
countSize:=0;
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
BlockWrite(f, Buffer, BufferLen);
countSize:=countSize + 1;
until (BufferLen = 0);
CloseFile(f) ;
result := True;
finally
CloseFile(f) ;
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end
end;
Pensé que poniéndole un contador de alguna manera detendría el bucle de escritura. Pensé en ponerlo así:
Código Delphi
[-]...
countSize:=0;
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
BlockWrite(f, Buffer, BufferLen);
countSize:=countSize + 1;
until (BufferLen = 0) or (countSize <= 314573);
...
Ah sí, el uso que le doy a la función, es este:
Código Delphi
[-]internetFile := 'http://api.twitter.com/1/statuses/user_timeline.xml?include_entities=false&include_rts=true&screen_name=twitterapi&count=15';
localFileName := 'user_timeline.xml';
GetInetFile( internetFile, localFilename);
Así que debería ser compatible descargando y guardando el XML resultante (con el que no tengo problemas procesando hasta los momentos). Gracias de antemano.