Delphi 6: Как я могу изменить созданную дату файла (= дата создания файла) - PullRequest
9 голосов
/ 09 декабря 2011

Я искал ЧАСЫ в Google (и здесь).

И я не могу найти решение.

Я хочу ИЗМЕНИТЬ" Created Filetime" (= время создания файла) в DELPHI 6 .

Не «время изменения файла» (для которого требуется простой вызов «FileSetDate ()») а не «Время последнего доступа к файлу».

Как мне это сделать?

Picture of what I mean...

Ответы [ 2 ]

7 голосов
/ 09 декабря 2011

Вызвать функцию SetFileTime Windows API.Передайте nil для lpLastAccessTime и lpLastWriteTime, если вы хотите изменить только время создания.

Вам потребуется получить дескриптор файла, вызвав CreateFile или одиниз оболочек Delphi, так что это не самый удобный API для использования.

Облегчите себе жизнь, заключив вызов API в вспомогательную функцию, которая получает имя файла и TDateTime.Эта функция должна управлять низкоуровневыми деталями получения и закрытия дескриптора файла и преобразования TDateTime в FILETIME.

Я бы сделал это так:

const
  FILE_WRITE_ATTRIBUTES = $0100;

procedure SetFileCreationTime(const FileName: string; const DateTime: TDateTime);
var
  Handle: THandle;
  SystemTime: TSystemTime;
  FileTime: TFileTime;
begin
  Handle := CreateFile(PChar(FileName), FILE_WRITE_ATTRIBUTES,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0);
  if Handle=INVALID_HANDLE_VALUE then
    RaiseLastOSError;
  try
    DateTimeToSystemTime(DateTime, SystemTime);
    if not SystemTimeToFileTime(SystemTime, FileTime) then
      RaiseLastOSError;
    if not SetFileTime(Handle, @FileTime, nil, nil) then
      RaiseLastOSError;
  finally
    CloseHandle(Handle);
  end;
end;

Мне пришлось добавить объявление FILE_WRITE_ATTRIBUTES, поскольку оно отсутствует в модуле Windows Delphi 6.

7 голосов
/ 09 декабря 2011

На основе FileSetDate вы можете написать аналогичную процедуру:

function FileSetCreatedDate(Handle: Integer; Age: Integer): Integer;
var
  LocalFileTime, FileTime: TFileTime;
begin
  Result := 0;
  if DosDateTimeToFileTime(LongRec(Age).Hi, LongRec(Age).Lo, LocalFileTime) and
    LocalFileTimeToFileTime(LocalFileTime, FileTime) and
    SetFileTime(Handle, @FileTime, nil, nil) then Exit;
  Result := GetLastError;
end;
...