Delphi 6: Как изменить созданный файл (=дата создания файла)

Я уже несколько часов ищу в Google (и здесь).

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

Я хочу изменить в "создано filetime и" (= filetime и создание) в DELPHI 6.

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

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

Picture of what I mean...

2 ответов


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

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

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

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

const
  FILE_WRITE_ATTRIBUTES = 00;

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 потому что он отсутствует в блоке Delphi 6 Windows.


на основе 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;