10

私は今、Google (およびここ) で HOURS を検索しています。

そして、私は解決策を見つけることができません。

DELPHI 6で「Created Filetime」(= creation filetime) を変更したい。

「変更されたファイル時間」(「FileSetDate()」への単純な呼び出しが必要)ではなく、「最終アクセスファイル時間」でもありません。

どうすればいいですか?

私が意味することの写真...

4

2 に答える 2

8

SetFileTimeWindowsAPI関数を呼び出します。作成時間を変更するだけの場合は、パスnilします。lpLastAccessTimelpLastWriteTime

、またはDelphiラッパーの1つを呼び出してファイルハンドルを取得する必要があるため、CreateFileこれは使用するのに最も便利なAPIではありません。

ファイル名とを受け取るヘルパー関数でAPI呼び出しをラップすることにより、自分の生活を楽にしますTDateTimeTDateTimeこの関数は、ファイルハンドルを取得して閉じる、およびをに変換するという低レベルの詳細を管理する必要があります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_ATTRIBUTESDelphi 6 Windowsユニットには存在しないため、の宣言を追加する必要がありました。

于 2011-12-09T13:44:10.053 に答える
7

に基づいて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;
于 2011-12-09T13:41:20.653 に答える