Ir al contenido


Foto

Refrescar el UrlDownloadToFile


  • Por favor identifícate para responder
4 respuestas en este tema

#1 petete2008

petete2008

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 10 febrero 2012 - 06:26

Tengo un problema a la hora de descargar contenido actualizado con urldownloadtofile.
He encontrado un hilo en otra web donde no han dado la solución y me preguntaba si alguien sabe la respuesta.
Muchas gracias.

url : http://www.clubdelph...4744#post424744

Tengo una Aplicación en Delphi, una de las cosas que hago es de descargar un archivo de una página web, lo hago con:
UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil)
....
Esto lo hago cada 5 mins. en un Timer, para que me refresque el contenido de dicho archivo que descargo(Porque Cada 5 Mins. Aprox. Cambia el Contenido), el problema que tengo que la PRIMERA VEZ que lo descarga lo hace Corrrectamente, pero de la Siguiente en Adelante NO REFRESCA el Contenido, si lo hago MANUALMENTE de ver el contenido del Archivo Accesando por medio del Internet Explorer veo el Contenido CORRECTAMENTE más sin embargo con la instrucción UrlDownloadToFile no funciona correctamente, de la segunda en adelante siempre muestra el contenido de la PRIMERA VEZ que Descargo el archivo, ya hice que borrará el archivo despues de leer el contenido, pero no funcionó, me hace pensar que no lo hace directamente de la Página WEB, es como si en la segunda vez en adelante lo leyera del buffer de la memoria.....

Nota: Tengo que Cerrar y Volver Abrir mi Aplicación para poder que TOME el Contenido Actualizado Correctamente.

Agradezco cualquier sugerencia.
  • 0

#2 petete2008

petete2008

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 10 febrero 2012 - 06:38

Lo resolvi :)



delphi
  1. function DownloadToFile(URL, FileName: String): Boolean;
  2. var  lpszFile:      Array [0..MAX_PATH] of Char;
  3. begin
  4.   // Download to cache by getting newest version
  5.   if (URLDownloadToCacheFile(nil, PChar(URL), @lpszFile, MAX_PATH, BINDF_GETNEWESTVERSION, nil) = S_OK) then
  6.     // Copy to desired file name
  7.     result:=CopyFile(@lpszFile, PChar(FileName), False)
  8.   else
  9.     // Failed
  10.     result:=False;
  11. end;


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 10 febrero 2012 - 07:34

Quizás estos enlaces dentro de DA sean de interés y completen el hilo:

1.- Cómo resumir una descarga. Donde se muestra a bajo nivel como descargar grandes archivos y retomar la misma si se interrumpe.

2.- Mostrar una Imagen desde una URL: LoadURLImage. Donde se muestra como descargar y mostrar un archivo de imagen usando la API URLDownloadToFile. Este ejemplo se puede extender a cualquier tipo de archivo que se quiera descargar.


Saludos.
  • 0

#4 petete2008

petete2008

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 12 marzo 2012 - 02:11

¿alguien conoce como ponerle un indicador de proceso (progressbar)?
Gracias

Lo resolvi :)



delphi
  1. function DownloadToFile(URL, FileName: String): Boolean;
  2. var  lpszFile:      Array [0..MAX_PATH] of Char;
  3. begin
  4.   // Download to cache by getting newest version
  5.   if (URLDownloadToCacheFile(nil, PChar(URL), @lpszFile, MAX_PATH, BINDF_GETNEWESTVERSION, nil) = S_OK) then
  6.     // Copy to desired file name
  7.     result:=CopyFile(@lpszFile, PChar(FileName), False)
  8.   else
  9.     // Failed
  10.     result:=False;
  11. end;



  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 14 marzo 2012 - 08:04

Siguiendo tu función, debes implementar una clase derivada de la interface IBindStatusCallback para aprovecharte de la función OnProgress

Pe pongoo un ejemplo de como hacerlo:


delphi
  1. uses
  2.   Urlmon, ActiveX;
  3.  
  4. type
  5. TIBindStatusCallback = class(TObject, IBindStatusCallback)
  6.   ProgressBar: TProgressBar;
  7.  
  8.   function OnLowResource(reserved: DWORD): HResult; stdcall;
  9.   function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
  10.             szStatusText: LPCWSTR): HResult; stdcall;
  11.   function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
  12.   function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
  13.   function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
  14.           stgmed: PStgMedium): HResult; stdcall;
  15.   function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
  16.   function GetPriority(out nPriority): HResult; stdcall;
  17.   function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
  18.  
  19.   function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
  20.   function _AddRef: Integer; stdcall;
  21.   function _Release: Integer; stdcall;
  22. end;
  23.  
  24. function TIBindStatusCallback.OnLowResource(reserved: DWORD): HResult;
  25. begin end;
  26.  
  27. function TIBindStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
  28.       szStatusText: LPCWSTR): HResult; stdcall;
  29. begin
  30.   ProgressBar.Max:= ulProgressMax;
  31.   ProgressBar.Position:= ulProgress;
  32.   ProgressBar.Update;
  33. end;
  34.  
  35. function TIBindStatusCallback.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
  36. begin end;
  37. function TIBindStatusCallback.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
  38. begin end;
  39. function TIBindStatusCallback.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
  40.           stgmed: PStgMedium): HResult; stdcall;
  41. begin end;
  42. function TIBindStatusCallback.OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
  43. begin end;
  44. function TIBindStatusCallback.GetPriority(out nPriority): HResult; stdcall;
  45. begin end;
  46. function TIBindStatusCallback.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
  47. begin end;
  48.  
  49. function TIBindStatusCallback.QueryInterface(const IID: TGUID; out Obj): HResult;
  50. begin end;
  51.  
  52. function TIBindStatusCallback._AddRef: Integer;
  53. begin end;
  54.  
  55. function TIBindStatusCallback._Release: Integer;
  56. begin end;
  57.  
  58. function DownloadToFile(URL, FileName: String; ProgressBar: TProgressBar): Boolean;
  59. var
  60.   lpszFile:      Array [0..MAX_PATH] of Char;
  61.   BindStatusCallback: TiBindStatusCallback;
  62. begin
  63.   ProgressBar.Position:= 0;
  64.   BindStatusCallback:= TIBindStatusCallback.Create();
  65.   BindStatusCallback.ProgressBar:= ProgressBar;
  66.   // Download to cache by getting newest version
  67.   if (URLDownloadToCacheFile(nil, PChar(URL), @lpszFile, MAX_PATH, BINDF_GETNEWESTVERSION, BindStatusCallback) = S_OK) then
  68.     // Copy to desired file name
  69.     result:=CopyFile(@lpszFile, PChar(FileName), False)
  70.   else
  71.     // Failed
  72.     result:=False;
  73.  
  74.   BindStatusCallback.Free;
  75. end;



Ejemplo de uso:


delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. begin
  3.   DownloadToFile(URL, 'File.jpg', ProgressBar1);
  4. end;




Saludos.
  • 0




IP.Board spam blocked by CleanTalk.