Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-05-2012
ehdez82 ehdez82 is offline
Miembro
 
Registrado: dic 2009
Posts: 13
Poder: 0
ehdez82 Va por buen camino
Buscar archivos con horario de verano activado

Estoy realizando una aplicación con Delphi 2010 que entre sus funciones busca en una carpeta los archivos modificados después de una fecha y hora. Estoy utilizando para esto el componente JvSearchFiles del paquete Jedi.
El problema es que cuando el sistema aplica automáticamente el horario de verano la hora de modificación de los archivos se adelanta una hora afectando la comparación.

He separado un pequeño ejemplo para explicar el problema, aqui está el código:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  D: TDateTime;
begin
  with JvSearchFiles do
  begin
    RootDirectory := ExtractFilePath(Application.ExeName) + '\Logs';
    D := EncodeDateTime(2011, 12, 5, 21, 30, 0, 0);
    MFiles.Lines.Add('Searching files modified after ' + DateTimeToStr(D));
    FileParams.SearchTypes := FileParams.SearchTypes + [stLastChangeAfter];
    FileParams.LastChangeAfter := D;
    Search;
  end;
end;

procedure TForm1.JvSearchFilesFindFile(Sender: TObject; const AName: string);
var
  S: String;
begin
  with JvSearchFiles do
  begin
    S := S + AName;
    S := S + '      Modified Time: ' + DateTimeToStr
      (FileTimeToDateTime(FindData.ftLastWriteTime));
    S := S + '      Creation Time: ' + DateTimeToStr
      (FileTimeToDateTime(FindData.ftCreationTime));
  end;
  MFiles.Lines.Add(S);
end;

Lo que me muestra en el memo es:

Searching files modified after 05/12/2011 02:00:00 PM
Log (1).log Modified Time: 05/12/2011 02:54:03 PM Creation Time: 12/05/2012 02:13:46 AM
Log (2).log Modified Time: 05/12/2011 08:57:16 PM Creation Time: 15/05/2012 01:32:04 PM
Log (3).log Modified Time: 05/12/2011 10:05:00 PM Creation Time: 15/05/2012 01:32:05 PM
Log (4).log Modified Time: 05/12/2011 10:59:27 PM Creation Time: 15/05/2012 01:32:05 PM

Lo que dice el explorador de windows 7 es:

Log (1).log Modified Time: 05/12/2011 01:54:03 PM Creation Time: 12/05/2012 02:13:46 AM
Log (2).log Modified Time: 05/12/2011 07:57:16 PM Creation Time: 15/05/2012 01:32:04 PM
Log (3).log Modified Time: 05/12/2011 09:05:00 PM Creation Time: 15/05/2012 01:32:05 PM
Log (4).log Modified Time: 05/12/2011 09:59:27 PM Creation Time: 15/05/2012 01:32:05 PM


El componente JvSearchFiles utiliza principalmente estos dos procedimientos:

Código Delphi [-]
procedure TJvSearchParams.SetLastChangeAfter(const Value: TDateTime);
var
  DosFileTime: Longint;
  LocalFileTime: TFileTime;
begin
  { Value must be >= 1-1-1980 }
  DosFileTime := DateTimeToDosDateTime(Value);
  if not Windows.DosDateTimeToFileTime(LongRec(DosFileTime).Hi,
    LongRec(DosFileTime).Lo, LocalFileTime) or
    not Windows.LocalFileTimeToFileTime(LocalFileTime, FLastChangeAfterFT) then
    RaiseLastOSError;

  FLastChangeAfter := Value;
end;

function TJvSearchParams.Check(const AFindData: TWin32FindData): Boolean;
begin
    ...
   
    if stLastChangeAfter in FSearchTypes then
      if CompareFileTime(ftLastWriteTime, FLastChangeAfterFT) < 0 then
        Exit;
    ...
end;

En el procedimiento SetLastChangeAfter se utilizan las funciones DateTimeToDosDateTime, DosDateTimeToFileTime y LocalFileTimeToFileTime los cuales por lo visto no logran que se le aplique a la fecha el horario de verano.

Cuando desactivo aplicar automáticamente el horario de verano todo funciona perfectamente y coincide la hora de modificación que muestra la aplicación con la del explorador de windows 7. Sin embargo no creo que la aplicación deba forzar al usuario a cambiar su configuración personal. Entonces lo que necesito es alguna forma de convertir mi fecha a la configuración local incluyendo el horario de verano.

Gracias de antemano.
Saludos.
Archivos Adjuntos
Tipo de Archivo: rar JvSearchFiles Test.rar (14,0 KB, 0 visitas)
Responder Con Cita
  #2  
Antiguo 17-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Con la hora UTC creo que solventas el problema:

Código Delphi [-]
procedure TMainForm.TimeZoneClick(Sender: TObject);
var
  MyTime : TDateTime;
  UTC: TSystemTime;
begin
  MyTime := Time;
  GetSystemTime(UTC);
  with Memo1.Lines do
  begin
    Add('PC time: '+TimeToStr(MyTime));
    Add('UTC: '+IntToStr(UTC.wHour)+':'+IntToStr(UTC.wMinute)+':'+IntToStr(UTC.wSecond));
    Add('Date: '+IntToStr(UTC.wYear)+':'+IntToStr(UTC.wMonth)+':'+IntToStr(UTC.wDay));
  end;
end;

Mira aquí.
Responder Con Cita
  #3  
Antiguo 17-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
También puede ser GMT:
Código Delphi [-]
function GMTToLocalTime(GMTTime: TDateTime): TDateTime; 
var   
  GMTST: Windows.TSystemTime;   
  LocalST: Windows.TSystemTime; 
begin    
  SysUtils.DateTimeToSystemTime(GMTTime, GMTST);    
  SysUtils.Win32Check(Windows.SystemTimeToTzSpecificLocalTime(nil, GMTST, LocalST));    
  Result := SysUtils.SystemTimeToDateTime(LocalST); 
end;

Aquí.
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
Como puedo evitar el horario de verano Parsec Varios 8 16-09-2011 16:44:14
Como saber si estamos en horario de verano o de invierno vejerf API de Windows 5 30-10-2008 20:03:04
Buscar archivos.. pabloa_m OOP 19 05-12-2006 20:38:56
Detectar Horario Verano/Invierno Javinho Varios 5 10-06-2004 16:40:24


La franja horaria es GMT +2. Ahora son las 14:28:44.


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