In acest caz insa uneori trebuie tinut cont de faptul ca folosind de exemplu TSearchRec.Time din Delphi pentru a obtine data ultimei modificari, se ia automat in calcul Time Zone-ul sistemului impreuna cu Daylight Saving Time. Astfel daca avem un fisier a carui data a ultimei modificari in format UTC este 01.01.2010 15:30:00 si suntem pe Time Zone +2, folosind TSearchRec.Time vom avea 01.01.2010 17:30:00. Peste asta mai intervine si Daylight Saving Time, care pe Time Zone-ul nostru influenteaza aceasta data cu o ora in plus vara, deci vom avea 01.01.2010 18:30:00.
Uneori avem nevoie de datele "reale" ale fisierului, adica cele in format UTC, neinfluentate de Time Zone si Daylight Saving Time. Astfel am conceput o functie care imi permite sa iau cele trei date ale unui fisier sau director (creare, modificare, acces) asa cum am nevoie - cu sau fara Time Zone si Daylight Saving Time. Functia se numeste GetFileTimes si o aveti mai jos. Aceasta functie se bazeaza pe cateva conversii intre diferite formate de data folosite in Delphi si pentru usurinta, acele conversii le-am mutat intr-o alta functie, GetDTFromFileTime, apelata de catre GetFileTimes pentru fiecare dintre cele trei date ale fisierului sau directorului.
Parametri GetFileTimes:
aPath - calea catre fisier sau director
aCreate, aModif, aAccess - parametrii in care se vor returna: data crearii, data ultimei modificari, data ultimului acces pe fisier
aWithTimeZone - daca este True se va tine cont de Time Zone si Daylight Saving Time; daca este False nu se va tine cont de cei doi factori si se vor returna datele in format UTC
Rezultat GetFileTimes:
True - operatie efectuata cu succes
False - fisierul nu a putut fi deschis sau s-a intalnit o exceptie
- function GetDTFromFileTime(aFileTime: TFileTime; aWithTimeZone: boolean): TDateTime;
- var
- lFileTime: TFileTime;
- lSystemTime: TSystemTime;
- lDateTime: TDateTime;
- begin
- Result := 0;
- // Verificam daca conversia din TFileTime in TDateTime trebuie sa tina cont de Time Zone si Daylight Saving Time
- // si facem conversia in TSystemTime
- if aWithTimeZone then
- begin
- FileTimeToLocalFileTime(aFileTime, lFileTime);
- FileTimeToSystemTime(lFileTime, lSystemTime);
- end
- else
- FileTimeToSystemTime(aFileTime, lSystemTime);
- // Conversie din TSystemTime in TDateTime si returnare rezultat
- lDateTime := EncodeDate(lSystemTime.wYear, lSystemTime.wMonth, lSystemTime.wDay);
- Result := lDateTime + EncodeTime(lSystemTime.wHour, lSystemTime.wMinute, lSystemTime.wSecond, lSystemTime.wMilliSeconds);
- if (Result <> SystemTimeToDateTime(lSystemTime)) then
- Result := SystemTimeToDateTime(lSystemTime);
- end;
- function GetFileTimes(aPath: string; var aCreate, aModif, aAccess: TDateTime; aWithTimeZone: boolean): boolean;
- var
- lFileHandle: integer;
- FTimeC, FTimeA, FTimeM: TFileTime;
- begin
- Result := False;
- aCreate := 0;
- aModif := 0;
- aAccess := 0;
- try
- // Deschidere fiser/director
- lFileHandle := Integer(CreateFile(PChar(aPath), GENERIC_READ,
- FILE_SHARE_READ, nil, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL or FILE_FLAG_BACKUP_SEMANTICS, 0));
- // Verificare daca fisierul/directorul a putut fi accesat
- if (lFileHandle <> 0) and (lFileHandle <> INVALID_HANDLE_VALUE) then
- begin
- // Preluare date in ca TFileTime
- GetFileTime(lFileHandle, @FTimeC, @FTimeA, @FTimeM);
- // Inchidere fisier
- FileClose(lFileHandle);
- // Conversie date fisier in TDateTime
- aCreate := GetDTFromFileTime(FTimeC, aWithTimeZone);
- aAccess := GetDTFromFileTime(FTimeA, aWithTimeZone);
- aModif := GetDTFromFileTime(FTimeM, aWithTimeZone);
- Result := True;
- end;
- except
- Result := False;
- end;
- end;
Pentru a vedea diferentele despre care vorbeam mai sus, folositi urmatoarea bucata de cod (Ignorati diferenta de max. 2 secunde care poate sa apara la unele fisiere sau directoare. Mai multe informatii aici):
- procedure TForm1.Button1Click(Sender: TObject);
- var
- lCreate, lModif, lAccess: TDateTime;
- lSearchRec: TSearchRec;
- begin
- GetFileTimes('CALE FISIER SAU DIRECTOR', lCreate, lModif, lAccess, False);
- if (FindFirst('CALE FISIER SAU DIRECTOR', faAnyFile, lSearchRec) = 0) then
- begin
- ShowMessage(// Data ultimei modificari returnata de functia GetFileTimes
- 'Modif GetFileTimes: ' + DateTimeToStr(lModif) + '; ' +
- // Data ultimei modificari returnata de TSearchRec.Time
- 'Modif TSearchRec.Time: ' + DateTimeToStr(FileDateToDateTime(lSearchRec.Time))
- );
- end;
- end;

