Как получить дату создания / последнего изменения файла в Delphi?

Я хочу получить в файлах эти атрибуты как целочисленные значения.

Почему целое число, что не так с TDateTime?

Toon Krijthe 28.09.2008 22:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
1
24 382
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Дельфийцам нравится подход FindFirst (в структуре SearchRec есть некоторые из них), но я бы предложил функцию GetFileAttributesEx API Win32.

Вы можете вызвать функцию winapi GetFileInformationByHandle. Aparently JCL имеет функцию GetFileLastWrite, которую вы также можете использовать

Пытаться

function FileAge(const FileName: string; out FileDateTime: TDateTime): Boolean;

Из SysUtils.

Устарело на момент написания этого комментария.

HX_unbanned 30.08.2012 18:27

FileAge() получает дату СОЗДАНИЯ файла, а не дату ПОСЛЕДНЕГО ИЗМЕНЕНИЯ.

Jerry Gagnon 24.05.2013 22:32

@JerryGagnon - Нет, он использует _WIN32_FILE_ATTRIBUTE_DATA.ftLastWriteTime

Gerry Coll 27.07.2016 02:19

@HX_unbanned - устарела только первая перегрузка (возвращающая FileTime)

Gerry Coll 27.07.2016 02:27

Эта перегрузка была добавлена ​​в Delphi 2006 (на случай, если кто-то еще столкнется с ошибкой компиляции в более старых версиях)

dummzeuch 15.12.2019 20:52

Из бесплатной библиотеки DSiWin32:

function DSiFileTimeToDateTime(fileTime: TFileTime; var dateTime: TDateTime): boolean;
var
  sysTime: TSystemTime;
begin
  Result := FileTimeToSystemTime(fileTime, sysTime);
  if Result then
    dateTime := SystemTimeToDateTime(sysTime);
end; { DSiFileTimeToDateTime }

function  DSiGetFileTimes(const fileName: string; var creationTime, lastAccessTime,
  lastModificationTime: TDateTime): boolean; 
var
  fileHandle            : cardinal;
  fsCreationTime        : TFileTime;
  fsLastAccessTime      : TFileTime;
  fsLastModificationTime: TFileTime;
begin
  Result := false;
  fileHandle := CreateFile(PChar(fileName), GENERIC_READ, FILE_SHARE_READ, nil,
    OPEN_EXISTING, 0, 0);
  if fileHandle <> INVALID_HANDLE_VALUE then try
    Result :=
      GetFileTime(fileHandle, @fsCreationTime, @fsLastAccessTime,
         @fsLastModificationTime) and
      DSiFileTimeToDateTime(fsCreationTime, creationTime) and
      DSiFileTimeToDateTime(fsLastAccessTime, lastAccessTime) and
      DSiFileTimeToDateTime(fsLastModificationTime, lastModificationTime);
  finally
    CloseHandle(fileHandle);
  end;
end; { DSiGetFileTimes }

почему параметр var, а не out - похоже, вы не используете входящее значение?

Kohi 25.05.2012 03:48

Действительный пункт. Я программист старой школы, я выучил это до того, как был изобретен out, и я автоматически использую var во всех случаях.

gabr 25.05.2012 11:18

Это должно работать, и это собственный код Delphi.

function GetFileModDate(filename : string) : integer;
var
  F : TSearchRec;
begin
  FindFirst(filename,faAnyFile,F);
  Result := F.Time;
  //if you wanted a TDateTime, change the return type and use this line:
  //Result := FileDateToDatetime(F.Time);
  FindClose(F);
end;

function GetFileModDate(filename : string) : TDateTime;
var
   F : TSearchRec;
begin
   FindFirst(filename,faAnyFile,F);
   Result := F.TimeStamp;
   //if you really wanted an Int, change the return type and use this line:
   //Result := F.Time;
   FindClose(F);
end;

F.Time с тех пор устарел, в файле справки указано Use F.TimeStamp.
Просто чтобы обновить это из-за более поздних версий Delphi

System.IOUtils имеет запись TFile с несколькими функциями для получения возраста файла, например. GetCreationTime, GetLastAccessTime, GetLastWriteTime

Другие вопросы по теме