Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-04-2006
Javier_A Javier_A is offline
Miembro
 
Registrado: oct 2003
Ubicación: Valencia
Posts: 93
Poder: 21
Javier_A Va por buen camino
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
__________________
La Guerra es una cosa muy seria para confiársela a los militares
Si quieres hecer una tarta de manzana partiendo de cero, primero tienes que crear el universo."

Última edición por Javier_A fecha: 05-04-2006 a las 12:22:34.
Responder Con Cita
  #2  
Antiguo 05-04-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 05-04-2006
Javier_A Javier_A is offline
Miembro
 
Registrado: oct 2003
Ubicación: Valencia
Posts: 93
Poder: 21
Javier_A Va por buen camino
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
__________________
La Guerra es una cosa muy seria para confiársela a los militares
Si quieres hecer una tarta de manzana partiendo de cero, primero tienes que crear el universo."

Última edición por Neftali [Germán.Estévez] fecha: 05-04-2006 a las 12:57:44.
Responder Con Cita
  #4  
Antiguo 05-04-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 05-04-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 07-04-2006
Javier_A Javier_A is offline
Miembro
 
Registrado: oct 2003
Ubicación: Valencia
Posts: 93
Poder: 21
Javier_A Va por buen camino
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
__________________
La Guerra es una cosa muy seria para confiársela a los militares
Si quieres hecer una tarta de manzana partiendo de cero, primero tienes que crear el universo."
Responder Con Cita
  #7  
Antiguo 07-04-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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);
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 07-04-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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);
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 07-04-2006
Javier_A Javier_A is offline
Miembro
 
Registrado: oct 2003
Ubicación: Valencia
Posts: 93
Poder: 21
Javier_A Va por buen camino
Código Delphi [-]
SysErrorMessage(GetLastError);

El resultado es...

GetLasError: Cardinal(no address)
Data
GetLastError           2
__________________
La Guerra es una cosa muy seria para confiársela a los militares
Si quieres hecer una tarta de manzana partiendo de cero, primero tienes que crear el universo."
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con las fechas NESU Varios 0 26-04-2005 16:18:13
Problema con fechas davidgaldo Conexión con bases de datos 2 30-07-2004 15:50:42
Problema con fechas en SQL tiel Tablas planas 1 10-06-2004 23:05:36
problema con fechas virolu SQL 2 17-05-2004 23:44:44
Problema Con Fechas En Bd davidgaldo Conexión con bases de datos 2 20-02-2004 12:47:05


La franja horaria es GMT +2. Ahora son las 21:47:54.


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
Copyright 1996-2007 Club Delphi