私は今、Google (およびここ) で HOURS を検索しています。
そして、私は解決策を見つけることができません。
DELPHI 6で「Created Filetime」(= creation filetime) を変更したい。
「変更されたファイル時間」(「FileSetDate()」への単純な呼び出しが必要)ではなく、「最終アクセスファイル時間」でもありません。
どうすればいいですか?
SetFileTime
WindowsAPI関数を呼び出します。作成時間を変更するだけの場合は、パスnil
します。lpLastAccessTime
lpLastWriteTime
、またはDelphiラッパーの1つを呼び出してファイルハンドルを取得する必要があるため、CreateFile
これは使用するのに最も便利な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
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;