PDA

Ver la Versión Completa : Fecha Modificacion fichero


jhonalone
28-09-2014, 22:31:48
Hola, amigos.
Estoy intentando ver la fecha de modificación de un fichero que está en mi página de internet.
Por más vueltas que he dado, no he encontrado nada. La function FileAge, no funciona, pues el fichero de internet viene dado como puntero y no como string.
Agradezco cualquier información.
Saludos.

Casimiro Notevi
28-09-2014, 22:45:47
¿Cómo lo haces, con indy?

jhonalone
28-09-2014, 22:55:05
No sé cómo hacerlo. No he usado Indi. Pero admito cualquier solución.
Gracias Casi.

jhonalone
28-09-2014, 23:11:30
Estoy más o menos aquí en este fragmento de código
hFile := CreateFile(PChar(Archivo), GENERIC_WRITE, 0, nil, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, 0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if (hNet <> nil) then //Si existe conexion a internet
begin
hUrl := InternetOpenUrl(hNet, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
if (hUrl <> nil) then // Existe el fichero en internet
begin
FechaModiFileInternet:=FileAge(hFile);

jhonalone
28-09-2014, 23:29:32
Mañana tengo que madrugar para ir a trabajar. Perdonar si no os contesto esta noche.
Saludos.

ecfisa
29-09-2014, 02:19:39
Hola jhonalone.
No sé cómo hacerlo. No he usado Indi. Pero admito cualquier solución.
Gracias Casi.

Usando el componente TidHTTP de Indy es muy simple:

uses idHTTP;

function GetInternetFileDateTime(aFileName: string): TDateTime;
begin
with TidHTTP.Create(nil) do
try
Head(aFileName);
Result:= Response.LastModified;
finally
Free;
end;
end;


Saludos :)

nlsgarcia
29-09-2014, 06:29:58
jhonalone,


...Estoy intentando ver la fecha de modificación de un fichero que está en mi página de internet...

:rolleyes:

Revisa este código:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinInet;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// Obtiene la última fecha de modificación de un archivo en internet
function GetLastModifiedDate(Url : String) : TDateTime;
var
hInet : HINTERNET;
hUrl : HINTERNET;
LastModifiedDate : SYSTEMTIME;
SizeDate : DWORD;
Index : DWORD;
begin
try
hInet := InternetOpen(PChar(Application.Title),INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
hUrl := InternetOpenURL(hInet,PChar(Url),nil,0,0,0);
SizeDate := SizeOf(LastModifiedDate);
Index := 0;
if HttpQueryInfo(hUrl,
HTTP_QUERY_LAST_MODIFIED or HTTP_QUERY_FLAG_SYSTEMTIME,
@LastModifiedDate,
SizeDate,
Index)
then
Result := SystemTimeToDateTime(LastModifiedDate)
else
Result := 0;
finally
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);
end;
end;

// Muestra la última fecha de modificación de un archivo en internet
procedure TForm1.Button1Click(Sender: TObject);
var
Url : String;
LastModifiedDate : String;
begin
Url := 'http://www.math-magic.com/pdf_files/basic_memorization/prime.pdf';
LastModifiedDate := FormatDateTime('yyyy/mm/dd hh:mm:ss',GetLastModifiedDate(Url));
MessageDlg(LastModifiedDate,mtInformation,[mbOK],0);
end;

end.

El código anterior en Delphi 7 sobre Windows 7 Professional x32, obtiene la fecha de última modificación de un recurso url por medio de las funciones de Windows Internet (WinINet) application programming interface (API) (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385331%28v=vs.85%29.aspx).

Espero sea útil :)

Nelson.

jhonalone
29-09-2014, 21:03:39
Primero: gracias a Ecfisa y a Nelson (por orden de respuestas), por vuestro esfuerzo al responderme.

Segundo: os cuento.

Ecfisa, Todavía no me puedo creer que un código tuyo no funcione a la primera. Me da un error en la línea del result, con la excepción EIdHTTPProtocolException con el mensaje "HTTP/1.1 404 Not Found" Puede que los Indy que he instalado estén obsoletos, son los que venían con Dephi7.

Nelson, tu código funciona perfectamente, excepto con algunas extensiones de ficheros. Concretamente con ".php", no sé si con alguna otra. Ah, la función discrimina entre mayúsculas y minúsculas, en el nombre de la url, por le interesa a alguien.

Nuevamente gracias a ambos por vuestro esfuerzo e interés.

Saludos.

Juan Manuel.

ecfisa
29-09-2014, 21:56:36
Hola jhonalone.
Me da un error en la línea del result, con la excepción EIdHTTPProtocolException con el mensaje "HTTP/1.1 404 Not Found" Puede que los Indy que he instalado estén obsoletos, son los que venían con Dephi7.

Son un poco viejitos :), pero estoy usando los mismos componentes y funciona correctamente... ¿ Tendrá algo que ver con esto ? idHTTP (Rest service) (http://www.delphipages.com/forum/showthread.php?t=213875)

Saludos :)

jhonalone
30-09-2014, 18:25:45
Gracias ecfisa por tu interés.
He estado visitando el enlace y no comprendo lo que me quieres decir. No sé si interpretar que debo identificarme...¿¡?

Ah. Cuando he incorporado el componente IdHTTP de Indy en el formulario, he dejado todas las propiedades por defecto. ¿Quizá tenga que configurar alguna?

Un saludo.

ecfisa
30-09-2014, 20:02:24
Hola jhonalone.
No sé si interpretar que debo identificarme...¿¡?
No puedo asegurarlo ya que desconozco todo sobre tu conexión, solo conjeturé una posible causa por el código de error.

Te adjunto una prueba donde tomo la fecha de última modificacion de un archivo (que verifiqué manualmente) y la devuelve correctamente. Espero te sirva de ayuda.

Saludos :)

nlsgarcia
30-09-2014, 20:40:54
jhonalone,


...tu código funciona perfectamente, excepto con algunas extensiones de ficheros. Concretamente con ".php"...no sé si con alguna otra...

:rolleyes:

Pregunto: ¿El servidor Web permite tener acceso para este tipo de consultas a los archivos .php en cuestión? :confused:

Espero sea útil :)

Nelson.

ecfisa
30-09-2014, 21:20:40
Pregunto: ¿El servidor Web permite tener acceso para este tipo de consultas a los archivos .php en cuestión? :confused:

He usado con anterioridad muchas veces ambos modos (Indy y WinInet) sin inconvenientes y coincido con vos en pensar que el problema que tiene pueda deberse a razones de permisos.

Sería interesante que jhonalone pusiera alguna cadena, de las que usa y le dan problemas, para poder hacer pruebas mas concretas.

Saludos :)

jhonalone
05-10-2014, 12:14:42
Hola amigos.
Yo tambien he sospechado que el problema con las extensiones .php debe ser una protección del servidor. De todos modos, no necesito, (de momento), utilizar la fecha de modifición de este tipo de ficheros.

Inclyo a continuación el código que me da problemas con las dos funciones, en las pruebas que he hecho. Así podéis probar vosotros con las mismas cadenas url. Con Indy no he conseguido más que el error comentado y con WinInet, os recuerdo que, savo las extensiones .php no me da ningún problema.
var
Url : String;
LastModifiedDate : String;
begin
Url := 'http://www.jmms.es/Contacto.php';
LastModifiedDate := FormatDateTime('yyyy/mm/dd hh:mm:ss',GetLastModifiedDate(Url));
MessageDlg(LastModifiedDate,mtInformation,[mbOK],0);
ShowMessage(' Fecha ultima modificacion = '+
DateTimeToStr(GetInternetFileDateTime('http://www.jmms.es/HISTO1.DAT')));
end;

ecfisa
05-10-2014, 18:57:47
Hola jhonalone.

Bueno, en principio parece que hay algo mal con tus componentes Indy.

Acabo de hacer una prueba con las direcciones que publicaste,

procedure TForm1.Button1Click(Sender: TObject);
var
msg: string;
begin
msg:= Format('Contacto.php: %s%s%sHISTO1.DAT: %s',[
DateTimeToStr(GetInternetFileDateTime('http://www.jmms.es/Contacto.php')),
#10#13,#10#13,
DateTimeToStr(GetInternetFileDateTime('http://www.jmms.es/HISTO1.DAT'))
]);
MessageBox(Handle,PChar(msg),'',MB_OK);
end;

Resultado:

http://sia1.subirimagenes.net/img/2014/10/05/141005064318899042.jpg

Es claro que existe un problema en la obtención de la fecha de "Contacto.php", pero en ningún momento obtengo errores como en tu caso (de todos modos tenes la alternativa de obtenerlas usando funciones de la API de windows como en el ejemplo que te publicó Nelson).

Saludos :)

nlsgarcia
05-10-2014, 19:46:58
jhonalone,


...en principio parece que hay algo mal con tus componentes Indy...

:rolleyes:

Pregunto:

1- ¿Que versión de Windows utilizas?, ¿Es de 32 ó 64 bits?.

2- ¿Que versión de Delphi utilizas?.

Revisa esta imagen:

http://i42.photobucket.com/albums/e305/nlsgarcia/InternetFile_zps8fc9744c.jpg

Los resultados anteriores son obtenidos con el código sugerido en el Msg #6 (Componentes Indy) y son análogos a los presentados en el Msg #15, sin que ocurriera ningún tipo de error durante la ejecución.

Espero sea útil :)

Nelson.

jhonalone
07-10-2014, 19:29:32
Como ya os comenté, con los componentes de WniInet obtengo los mismos resultados que vosotros. El problema puede estar en los componentes Indy.

Uso Windows XP Professional y Delphi7, que los tengo instalados en un ordenador de sobremesa que ya utilizo muy poco.

Usaré WinInet. El tema de la fecha en las extensiones .php, sospecho que debe ser alguna protección del servidor.

Saludos y muchas gracias a ambos por vuestra ayuda.