私はHOURS on Google(およびここから)を探しています。Delphi 6:作成したファイルを変更する方法(ファイル作成日時)
解決策が見つかりません。
私はDELPHI 6でCHANGE "作成さ FILETIME"(=創造FILETIME)にしたいです。
「変更されたファイル時間」(「FileSetDate()」の簡単な呼び出しが必要) ではなく、「最後にアクセスされたファイル時間」ではありません。
どうすればよいですか?
私はHOURS on Google(およびここから)を探しています。Delphi 6:作成したファイルを変更する方法(ファイル作成日時)
解決策が見つかりません。
私はDELPHI 6でCHANGE "作成さ FILETIME"(=創造FILETIME)にしたいです。
「変更されたファイル時間」(「FileSetDate()」の簡単な呼び出しが必要) ではなく、「最後にアクセスされたファイル時間」ではありません。
どうすればよいですか?
コールSetFileTime
Windows API関数。作成時間を変更したい場合はnil
をlpLastAccessTime
に、lpLastWriteTime
に渡してください。
CreateFile
、またはDelphiラッパーの1つを呼び出すことによってファイルハンドルを取得する必要があります。このため、これは最も便利なAPIではありません。
ファイル名とTDateTime
を受け取るヘルパー関数でAPI呼び出しをラップすることで、自分の生活を楽にします。この関数は、ファイルハンドルの取得とクローズの低レベルの詳細を管理し、TDateTime
をFILETIME
に変換する必要があります。
私はこのようにそれを行うだろう:それは、Delphi 6のWindowsユニットに存在しないので、私はFILE_WRITE_ATTRIBUTES
の宣言を追加する必要がありました
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;
。
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;
Yeahhhh !!!!あなたはロック!最後に動作するもの! – user1089764
ありがとうございました!!!! – user1089764