ファイルタイムスタンプの設定
概要
この記事ではファイルのタイムスタンプを取得w」設定する、GetFileTime, SetFileTime API を紹介します。
ファイル タイムスタンプのコピー
通常、ファイルのタイムスタンプは、ファイルを作成・変更したときに Windows が自動的に設定してくれるものですが、意図的にタイムスタンプを操作したい場合・操作した方が良い場合も少なくありません。 例えば、画像ビューアでデジカメで撮った写真を見ているとします。そこで、縦横の写りを修正するために回転するとします。このとき、もし画像ファイルのタ イムスタンプが変わってしまうと、ファイルの日付が画像を回転したときの時刻になってしまい、肝心の撮影した日時がわからなくなってしまいます (運良く Exif 情報等にデータが残っていれば助かりますが)。
ファイルの変更が大した意味を持たないような場合にはファイルの作成日時、変更日時をデータとして取っておき、ファイル編集後、そのデータを使ってタイム スタンプを元に戻すと良いでしょう。
サンプルコード
では、早速 タイムスタンプをコピーするコードを紹介します。ここでは、HANDLE 型の hSrc で示されるファイルのタイムスタンプを取得して、hDist で示されるファイルへそれをセットしています。
FILETIME ftCreationTime,
ftLastAccessTime, ftLastWriteTime;
if ( !GetFileTime ( hSrc,
&ftCreationTime, &ftLastAccessTime,
&ftLastWriteTime ) ) {
// エラー
}
if ( !SetFileTime ( hDist,
&ftCreationTime, &ftLastAccessTime,
&ftLastWriteTime ) ) {
// エラー
}
ここで、 FILETIME は次の形をしている構造体です。
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
タイムスタンプは上記のように 64 ビットのデータとしてあらわされます。SystemTimeToFileTime API や FileTimeToSystemTime API を使えば SYSTEMTIME 型と FILETIME 型のデータの相互変換が可能です。
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
SYSTEMFILE 型は見てすぐにわかりますよね。Year, Month, Day など、素直に日付を設定するだけです。