Ver Mensaje Individual
  #1  
Antiguo 18-10-2012
Avatar de HombreGordo
HombreGordo HombreGordo is offline
Miembro
 
Registrado: jul 2008
Posts: 41
Reputación: 0
HombreGordo Va por buen camino
Smile Problema para descargar archivo de Internet

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.
__________________
Aprendiz de Embarcadero RAD Studio...
Responder Con Cita