ファイル時間

ファイル時刻は、1601 年 1 月 1 日の午前 12 時から経過した 100 ナノ秒間隔 (UTC) の数を表す 64 ビット値です。 システムは、アプリケーションがファイルを作成、アクセス、およびファイルに書き込むときに、ファイル時刻を記録します。

NTFS ファイル システムは UTC 形式で時刻値を格納するため、タイム ゾーンや夏時間の変更の影響を受けません。 FAT ファイル システムは、コンピューターの現地時刻に基づいて時刻値を格納します。 たとえば、ワシントンの PST の午後 3 時に保存されたファイルは、NTFS ボリュームではニューヨークの午後 6 時 00 分 EST と見なされますが、FAT ボリュームではニューヨークでは午後 3 時 00 分 EST と見なされます。

タイムスタンプは、さまざまなタイミングで、さまざまな理由で更新されます。 ファイル タイム スタンプに関する唯一の保証は、変更を行うハンドルが閉じられたときにファイル時刻が正しく反映されるということです。

すべてのファイル・システムが作成時刻と最終アクセス時間を記録できるわけではありません。また、すべてのファイル・システムが同じ方法で記録するわけではありません。 たとえば、FAT での作成時間の解像度は 10 ミリ秒ですが、書き込み時間の解像度は 2 秒で、アクセス時間の解像度は 1 日なので、実際にはアクセス日です。 NTFS ファイル システムは、ファイルの最終アクセス時間に対する更新を、最後のアクセスから最大 1 時間遅延します。

指定したファイルのファイル時刻を取得するには、 GetFileTime 関数を使用します。 GetFileTime は、作成、最後のアクセス、および最後の書き込み時刻を個々の FILETIME 構造体にコピーします。 FindFirstFile 関数と FindNextFile 関数を使用して、ファイル時刻を取得することもできます。 これらの関数は、ファイル時刻を WIN32_FIND_DATA 構造体の FILETIME 構造体にコピーします。 ファイルに書き込む場合、書き込みに使用されるすべてのハンドルが閉じられるまで、最後の書き込み時間は完全には更新されません。

ファイルのファイル時刻を設定するには、 SetFileTime 関数を使用します。 この関数を使用すると、ファイルの内容を変更せずに、作成、最後のアクセス、および最後の書き込み時間を変更できます。 CompareFileTime 関数を使用して、さまざまなファイルの時間を比較できます。 この関数は 2 つのファイル時刻を比較し、後の時刻を示す値を返し、時刻が等しい場合は 0 (ゼロ) を返します。

指定したファイルのファイル時刻を変更する場合は、 SystemTimeToFileTime 関数を使用して、日付と時刻をファイル時刻に変換できます。 また、GetSystemTimeAsFileTime 関数を呼び出すことによって、FILETIME 構造体のシステム時刻を取得することもできます。

ファイル時刻をユーザーに簡単に表示するには、 FileTimeToSystemTime 関数を使用します。 FileTimeToSystemTime は、ファイル時刻を変換し、月、日、年、時刻をファイル時刻から SYSTEMTIME 構造体にコピーします。

ファイルの時刻と夏時間

ユーザーが夏時間に合わせてシステムを自動的に調整するように設定している場合は、ファイル時刻を使用する際に注意する必要があります。

ファイル時刻をローカル時刻に変換するには、 FileTimeToLocalFileTime 関数を使用します。 ただし、 FileTimeToLocalFileTime では、タイム ゾーンと夏時間に現在の設定が使用されます。 したがって、夏時間の場合は、変換するファイル時刻が標準時であっても、夏時間が考慮されます。

FAT ファイル システムは、ディスク上の時刻をローカル時刻に記録します。 GetFileTime は、FAT ファイル システムからキャッシュされた UTC 時刻を取得します。 夏時間になると、キャッシュが更新されないため、 GetFileTime によって取得される時刻は 1 時間が切れます。 コンピューターを再起動すると、 GetFileTime が取得するキャッシュされた時刻が正しいです。 FindFirstFile は FAT ファイル システムからローカル時刻を取得し、タイム ゾーンと夏時間の現在の設定を使用して UTC に変換します。 そのため、夏時間の場合、 FindFirstFile では、変換するファイル時刻が標準時であっても夏時間が考慮されます。

NTFS ファイル システムは、ディスク上の時刻を UTC で記録します。 ファイル時刻をローカル時刻に変換するときに夏時間を考慮するには、 FileTimeToLocalFileTime を使用する代わりに、次の一連の関数を使用します。

ファイルの時刻と CDFS

コンパクト ディスク ファイル システム (CDFS) を使用してメディア上にある、またはメディアから送信されたファイルの日付とタイム スタンプは、ローカル タイム ゾーンに合わせて調整されます。 ISO 9660 は、CDFS がローカル タイム ゾーンの日付情報を正しく表示することを示しています。 これにより、CDFS 上のファイルの日付がユニバーサル ディスク形式 (UDF) の日付と同じように表示されます。 UDF は、配布メディアの新しい標準です。 コードが CDFS を使用してメディアに存在するか、メディアから送信されたファイルの変更されていない日付情報に依存している場合は、正しく機能しない可能性があります。