ファイルの作成日付を変更する

 ファイルの更新日付と作成日付を変更するサンプルです。日付の変更には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)

 このユニットとサンプルの使用は改変や一部流用も含めて自由です。