Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Un problema con las fechas de los archivos (https://www.clubdelphi.com/foros/showthread.php?t=30397)

Javier_A 05-04-2006 11:57:38

Un problema con las fechas de los archivos
 
Hola a tod@s,
He implementado una aplicación donde guardo una serie de documentos con las fechas de creación, modificación y ultimo acceso, utilizando para ello este código ( sacado de la web de Neftali ).

He aquí una parte de él.

Cita:

r := FindFirst(nombre + '\*.*', FaAnyfile, DirInfo);
while r = 0 do begin
if ((DirInfo.Attr and FaDirectory <> FaDirectory) and (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
begin
maxi:=length(DirInfo.Name);
fpos:=copy(DirInfo.Name,maxi-3,maxi);
if fpos='.doc' then
begin
if GetFileTimes(DirInfo.Name, CDate, MDate, ADate) then
begin
FechaCreacion := FormatDateTime('dd/mm/yyyy hh:nn',CDate);
Fechamodificacion := FormatDateTime('dd/mm/yyyy hh:nn',MDate);
FechaUltAcceso := FormatDateTime('dd/mm/yyyy hh:nn',ADate);
end
else
begin
FechaCreacion:='';
Fechamodificacion:='';
FechaUltAcceso:='';
end;
El funcionamiento de la aplicación es el siguiente:

* En una tabla cada usuario guarda los directorios donde guardan los documentos
* Con un clic a un boton la aplicación va al interior de los directorios y selecciona los documentos que se guardan en otra tabla ( nombre, fecha creacion, etc..)
Hasta aqui todo correcto, pero si uno de los usuarios vuelve a pulsar el boton, la aplicación borra los documentos anteriormente guardados por él, y graba los nuevos pero la fecha de creación la graba con una fecha del siglo pasado, ¿ por que pierde este dato ?

Lo curioso es que si borra los directorios, los vuelve a grabar y pulsa el boton para actualizar los documentos, vuelve a aparecer la fecha correcta.
¿ Me podeis decir como puedo solucionar esto ?

Os espero....
Un saludo

Neftali [Germán.Estévez] 05-04-2006 12:07:57

Hola, antes de nada decirte, que con 90 mensajes en los foros, ya no eres un novato y deberías poner TAG's cuando añadas código Delphi. Edita tu mensaje y añádelos, por favor.

Cita:

Empezado por Javier_A
...pero si uno de los usuarios vuelve a pulsar el boton, la aplicación borra los documentos anteriormente guardados por él, y graba los nuevos pero la fecha de creación la graba con una fecha del siglo pasado, ¿ por que pierde este dato ?
...si borra los directorios, los vuelve a grabar y pulsa el boton para actualizar los documentos, vuelve a aparecer la fecha correcta.

No se si te he entendido bien, pero seguramente el problema esté en el código del botón o en las opciones de guardar. Ese código no es el que has puesto, por lo tanto es difícil saber qué es lo que está pasando.
Por lo que explicas, parece que sólo ocurre cuando "das una segunda pasada", revisa las inicializaciones de variables o ejecuta paso a paso el código para ver qué valor se rellena en las fechas la segunda vez.

Javier_A 05-04-2006 12:40:19

Hola Neftali,

¡¡ Arreglados los mensajes !!

Te envío el código completo del procedimiento:

Código Delphi [-]
For n:=1 To Caminos.RecordCount do
begin
 nombre:=caminos.FieldByName('camino').Value;
 r := FindFirst(nombre + '\*.*', FaAnyfile, DirInfo);
 while r = 0 do  begin
   if ((DirInfo.Attr and FaDirectory <> FaDirectory) and (DirInfo.Attr and FaVolumeId <> FaVolumeID)) then
       begin
       maxi:=length(DirInfo.Name);
       fpos:=copy(DirInfo.Name,maxi-3,maxi);
       if fpos='.doc' then
       begin
           if GetFileTimes(DirInfo.Name, CDate, MDate, ADate) then
           begin
            FechaCreacion := FormatDateTime('dd/mm/yyyy hh:nn',CDate);
            Fechamodificacion := FormatDateTime('dd/mm/yyyy hh:nn',MDate);
            FechaUltAcceso := FormatDateTime('dd/mm/yyyy hh:nn',ADate);
            end
            else
           begin
            FechaCreacion:='';
            Fechamodificacion:='';
            FechaUltAcceso:='';
           end;
    try
    Servidor.Open;
    except
    showmessage('Base de datos abierta, intentelo mas tarde');
    exit;
    end;
    Servidor.append;


    Servidor.FieldByName('Nombre').Value:=DirInfo.Name;
    If nombre<>'C:\' then
      Servidor.FieldByName('CaminoLocal').Value:=Nombre+'\'+dirInfo.Name
    else
       Servidor.FieldByName('CaminoLocal').Value:=Nombre+dirInfo.Name;
    If nombre<>'C:\' then
     Servidor.FieldByName('CaminoRemoto').Value:='\\Javier\'+copy(nombre,4,length(nombre))+'\'+dirInfo.Na  me
    else
    Servidor.FieldByName('CaminoRemoto').Value:='\\Javier'+copy(nombre,4,length(nombre))+'\'+dirInfo.Nam  e;
    Servidor.FieldByName('Usuario').Value:='JAVIER'; //  Mayusculas
    Present:= Cdate;
    DecodeDate(Present, Year, Month, Day);
    Fechacreacion:=IntTostr((Year*10000)+(Month*100)+Day);
//    Showmessage(Fechacreacion);
    Servidor.FieldByName('FechaCreacion').Value:=Fechacreacion;
    Servidor.FieldByName('FechaModificacion').Value:=Fechamodificacion;
    Servidor.FieldByName('FechaUltacceso').Value:=Fechaultacceso;
    Servidor.FieldByName('empres').Value:=001;
    Servidor.FieldByName('Cliente').Value:=copy(Servidor.FieldByName('Nombre').Value,pos('_',Servidor.Fi  eldByName('Nombre').Value)+1,length(Servidor.FieldByName('Nombre').Value));
    Servidor.Post;
//           Graba 
       end;
      end;
       r := FindNext(DirInfo);
 end;
   SysUtils.FindClose(DirInfo);
//    Showmessage(nombre+'  '+IntTostr(suma));
caminos.Next;
end;
Bitbtn1.Enabled:=True;
Bitbtn2.Enabled:=True;
Bitbtn5.Enabled:=True;
Form1.Refresh;

end;

Si, es cuando doy una segunda pasada, y la fecha de creación que me da es 30/diciembre/1899 ????.
¿ Sabes que motivo puede ocasionar esto ?

Gracias por tu ayuda y por tu web
Un saludo

Neftali [Germán.Estévez] 05-04-2006 13:00:04

Gracias por corregir los mensajes. Un comentario sólo, ya que te has tomado la molestia de cambiarlos, mejor hacerlo bien del todo; En lugar de usar los TAG's de QUOTE puedes utilizar los TAG's de DELPHI (o ponerlos con el último botón del editor en modo avanzado).

Mira la diferencia entre tus dos ultimos mensajes; En uno he cambiado los TAG's y he puesto los de DELPHI, de esa forma se formatea la sintaxis correctamete.

Neftali [Germán.Estévez] 05-04-2006 13:01:41

Cita:

Empezado por Javier_A
...Si, es cuando doy una segunda pasada, y la fecha de creación que me da es 30/diciembre/1899 ????.

Me da la impresión de que esa fecha es la que se guarda cuando grabas fecha incorrecta, nula o vacía (en tu caso vacía).

Javier_A 07-04-2006 10:59:45

Esquema del funcionamiento:
- En una tabla tengo los path de unos directorios
- Al darle un clic de botón,( boton de actualizar), mi programa lee el contenido de los directorios y graba el nombre de los ficheros y su fecha de creación en otra tabla.

Cuando lo hago por primera vez no hay ningun problema, pero si le doy al boton,( boton de actualizar), por segunda vez ------ FileHandle siempre es <0 -----( porción de programa que hay debajo ), y las fechas son del 30/12/1899 ¿ Se puede solucionar esto ?

Código Delphi [-]
// Abrir el fichero
FileHandle := FileOpen(FileName,fmShareDenyNone);
 // inicializar
 Created := 0.0;
 Modified := 0.0;
 Accessed := 0.0;
// showmessage(IntTostr(FileHandle));
 // Ha tenido acceso al fichero?
 if FileHandle < 0 then
 RetVar := false
 else begin
 // Obtener las fechas
 RetVar := true;
 GetFileTime(FileHandle,@FTimeC,@FTimeA,@FTimeM);
 // Cerrar
 FileClose(FileHandle);
 // Creado
 FileTimeToLocalFileTime(FTimeC,LTime);
 if FileTimeToSystemTime(LTime,STime) then begin
 Created := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
 Created := Created + EncodeTime(STime.wHour,STime.wMinute,STime.wSecond,
  STime.wMilliSeconds);
 end;
etc..
etc..

Saludos

Lepe 07-04-2006 11:59:22

Si estas usando FindFirst para encontrar los archivos, tienes el campo FindData, y dentro de ella tienes la fecha de creación, usando FiletimeToDateTime ya tienes la fecha exacta.

Ten en cuenta el sistema operativo y el sistema de archivos, En NTFS si se recaba la información de todas las fechas; aunque puede desabilitarse por windows la "fecha de última modificación". En FAT no se recaban todas las fechas.


Aqui he usado un TStringList (Lista) para almacenar los valores como si de un archivo TiniFile se tratara, de esa forma se recuepera facilmente las fechas y nombres de archivo.
Código Delphi [-]
  if FindFirst(dir+'*.txt', faAnyFile , s) = 0 then
  begin
    repeat
        fecha := FiletimeTodatetime(s.FindData.ftCreationTime);
        List.Add(s.Name+'='+DateTimeToStr(fecha));
    until FindNext(s) <> 0;
    sysutils.FindClose(s);

Neftali [Germán.Estévez] 07-04-2006 11:59:57

Cita:

Empezado por Javier_A
...FileHandle siempre es <0

Significa que ha ocurrido un error al intentar abrir el fichero.
Prueba a mostrarlo con esto:
Código Delphi [-]
  SysErrorMessage(GetLastError);

Javier_A 07-04-2006 12:27:24

Código Delphi [-]
SysErrorMessage(GetLastError);

El resultado es...

GetLasError: Cardinal(no address)
Data
GetLastError           2


La franja horaria es GMT +2. Ahora son las 18:50:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi