ファイルの作成日付を変更する
ファイルの更新日付と作成日付を変更するサンプルです。日付の変更にはWindowsAPIのSetFileTimeを使用します。日付の取得はGetFileTimeで所得でするほか、FindFirst, FindNextで用いられるTSearchRec構造体のFindDataメンバでの取得も可能です。SetFileTimeではファイルハンドルを指定しますが、これにはTFileStreamのHandleプロパティを指定するのが簡単です。
応用例として、エクスプローラ風のファイル更新日時と作成日時を変更するサンプルを公開します。プロジェクトソース付きです(コンパイルにはかみけんさんのTFolderViewコンポーネントが必要です)。
// TFileTime型をTDateTime型に変換する
function FileTimeToDateTime( FileTime:TFileTime ):TDateTime;
var
LocalFileTime: TFileTime;
SystemTime: TSystemTime;
begin
result := 0;
if (FileTime.dwLowDateTime = 0) and (FileTime.dwHighDateTime = 0) then
Exit;
FileTimeToLocalFileTime(FileTime,LocalFileTime);
FileTimeToSystemTime(LocalFileTime,SystemTime);
result := SystemTimeToDateTime(SystemTime);
end;
// TDateTime型をTFileTime型に変換する
function DateTimeToFIleTime(FileTime:TDateTime):TFileTime;
var
LocalFileTime, Ft: TFileTime;
SystemTime: TSystemTime;
begin
result.dwLowDateTime := 0;
result.dwHighDateTime := 0;
DateTimeToSystemTime(FileTime, SystemTime);
SystemTimeToFileTime(SystemTime, LocalFileTime);
LocalFileTimeToFileTime(LocalFileTime, Ft);
result := Ft;
end;
// ファイルの更新日付,作成日付を変更する
// 最終アクセス日付も変更出来るが、ナンセンスなため変更しない
procedure SetFileDate(FileName: string; UpDate, CrDate: TDateTime);
var
Ut, Ct: TFileTime;
Fs: TFileStream;
begin
Fs := TFileStream.Create(FileName, fmOpenReadWrite);
try
Ct := DateTimeToFileTIme(CrDate);
Ut := DateTimeToFileTime(UpDate);
// ファイル日付を変更する
// SetFileTimeの詳細はWin32APIのヘルプを参照
SetFileTime(Fs.Handle, @Ct, nil, @Ut);
finally
Fs.Free;
end;
end;
サンプルのダウンロード(178,146byte)
このユニットとサンプルの使用は改変や一部流用も含めて自由です。