Как получить даты создания, доступа и изменения файла так же, как свойства Windows? - PullRequest
12 голосов
/ 09 февраля 2012

Я пытаюсь получить те же даты Создания, Доступа и Изменения, которые отображаются в свойствах окна, как в:

File Properties

Но я нахожу, что время постоянно составляет 30 минут:

File Properties Delphi

Возможно, это как-то связано с часовыми поясами / переходом на летнее время, но не удалось найти решение.Пробовал смотреть на: TimeZone Bias и настраивать и смотреть на различные методы, включая: Как получить даты создания / последнего изменения файла в Delphi?

Текущий код:

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));
 ...

Любая помощь приветствуется

Спасибо, Пол

Ответы [ 2 ]

27 голосов
/ 09 февраля 2012

Я не уверен, что не так с вашим текущим кодом, но я верю, что этот код будет делать то, что вам нужно, используя стандартные вызовы Windows API.

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 голосов
/ 09 февраля 2012

Вы можете использовать приведенный ниже код для преобразования значения времени в формате UTC в местное значение даты и времени:

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;

Судя по вашим изображениям, ваше смещение фактически составляет 10 часов и 30 минут. Вы находитесь в Южной Австралии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...