2012-02-09 18 views
10

Sto cercando di ottenere gli stessi creati date, accessibile e modificabile come appare nelle proprietà di Windows come in:Come ottenere le date di creazione, accesso e modifica di file come le proprietà di Windows?

File Properties

Ma sto trovando i tempi sono sempre 30 minuti fuori:

File Properties Delphi

Credere che potrebbe avere qualcosa a che fare con i fusi orari/l'ora legale ma non è stato possibile trovare una soluzione. Hanno provato guardando: TimeZone Bias e la regolazione e guardando metodi diversi, tra cui: How to get create/last modified dates of a file in Delphi?

codice attuale:

var 
MyFd TWin32FindData; 
FName: string; 
MyTime: TFileTime; 
MySysTime: TSystemTime; 
myDate, CreateTime, AccessTime, ModTime: TDateTime; 
Begin 
... 
FindFirstFile(PChar(FName), MyFd); 
MyTime:=MyFd.ftCreationTime; 
FileTimeToSystemTime(MyTime, MySysTime); 
myDate := EncodeDateTime(MySysTime.wYear, MySysTime.wMonth, MySysTime.wDay, MySysTime.wHour, 
MySysTime.wMinute, MySysTime.wSecond, MySysTime.wMilliseconds); 
Memo1.Lines.Add('Created: '+ FormatDateTime('dddd, d mmmm yyyy, hh:mm:ss ampm', MyDate)); 
... 

Qualsiasi aiuto apprezzato

Grazie Paul

+0

Non ci hai detto come stai attualmente ottenendo le informazioni. –

+0

David - ha aggiunto il codice corrente ma ha provato numerosi metodi –

+2

OK, manca la conversione da UTC a ora locale. La mia risposta e anche lo show di Kobik su come farlo. –

risposta

24

Non sono sicuro di cosa non funzioni con il codice corrente, ma credo che questo codice farà ciò che è necessario, utilizzando le chiamate API standard di Windows.

procedure TMyForm.ReportFileTimes(const FileName: string); 

    procedure ReportTime(const Name: string; const FileTime: TFileTime); 
    var 
    SystemTime, LocalTime: TSystemTime; 
    begin 
    if not FileTimeToSystemTime(FileTime, SystemTime) then 
     RaiseLastOSError; 
    if not SystemTimeToTzSpecificLocalTime(nil, SystemTime, LocalTime) then 
     RaiseLastOSError; 
    Memo1.Lines.Add(Name + ': ' + DateTimeToStr(SystemTimeToDateTime(LocalTime))); 
    end; 

var 
    fad: TWin32FileAttributeData; 

begin 
    if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then 
    RaiseLastOSError; 
    Memo1.Clear; 
    Memo1.Lines.Add(FileName); 
    ReportTime('Created', fad.ftCreationTime); 
    ReportTime('Modified', fad.ftLastWriteTime); 
    ReportTime('Accessed', fad.ftLastAccessTime); 
end; 

procedure TMyForm.Button1Click(Sender: TObject); 
begin 
    ReportFileTimes(Edit1.Text); 
end; 
3

si dovrebbe essere in grado di utilizzare il codice riportato di seguito per trasformare un valore di data ora UTC in un valore di data ora locale:

uses 
    Windows; 

function UTCTimeToLocalTime(const aValue: TDateTime): TDateTime; 
var 
    lBias: Integer; 
    lTZI: TTimeZoneInformation; 
begin 
    lBias := 0; 
    case GetTimeZoneInformation(lTZI) of 
    TIME_ZONE_ID_UNKNOWN: 
     lBias := lTZI.Bias; 
    TIME_ZONE_ID_DAYLIGHT: 
     lBias := lTZI.Bias + lTZI.DaylightBias; 
    TIME_ZONE_ID_STANDARD: 
     lBias := lTZI.Bias + lTZI.StandardBias; 
    end; 
    // UTC = local time + bias 
    // bias is in number of minutes, TDateTime is in days 
    Result := aValue - (lBias/(24 * 60)); 
end; 

A giudicare dalle immagini l'offset è in realtà 10 ore e 30 minuti. Sei in Australia Meridionale?

+0

Henrick, Si Adelaide South Australia. Questo è stato in grado di convertire tutte le volte allo stesso come nelle proprietà di Windows. Apprezzo il tuo tempo –

+2

Hai capito! :-) Un altro modo è 'FileTimeToLocalFileTime' – OnTheFly

Problemi correlati