ctimeがファイルの作成時刻とは限らない

statで取れる情報の中にはatime, mtime, ctimeがあって、ファイルのアクセス時刻や更新時刻がわかるわけだけど、ctimeって作成時刻だと思ってたら違ったよ!
いや、どうやらOSによって異なってくるらしい。Windowsの場合は作成時刻で、Linuxの場合は状態変更時刻らしい。


エクスプローラでファイルのプロパティを見ると「作成日時」「更新日時」「アクセス日時」って並んでるし、多くの記事でも作成日時って書かれてたりするから、ctimeは作成日時なんだと思い込んでたよ!

Linuxの場合


    time_t    st_atime;   /* 最終アクセス時刻 */
    time_t    st_mtime;   /* 最終修正時刻 */
    time_t    st_ctime;   /* 最終状態変更時刻 */

st_atime フィールドはファイルアクセスがあった場合に変更される (例えば、 execve(2), mknod(2), pipe(2), utime(2) を使用した場合や read(2) で 1 バイト以上読み込んだ場合など)。 mmap(2) などの他のルーチンでは、 st_atime は更新されることもあれば、そうでない場合もある。

st_mtime フィールドは、ファイルが修正された場合に変更される (例えば、 mknod(2), truncate(2), utime(2) を使用した場合や write(2) で 1 バイト以上書き込みをした場合など)。さらに、ディレクトリの st_mtime は、そのディレクトリでファイルが作成されたり削除されたりすると変更される。 st_mtime フィールドは所有者やグループやハード・リンク数やモードの変更では変更 されない。

st_ctime フィールドは書き込みや inode 情報 (所有者、グループ、リンク数、モードなど) の設定によって変更される。

Linuxではファイル作成時刻は存在しない
作成時刻を持っているファイルシステムもあるけど、一般的に利用可能な状態にはなさそうだし。

Windowsの場合


st_atime
ファイルが最後にアクセスされた時刻。NTFS では有効ですが、FAT フォーマットのディスク ドライブでは無効です。
st_ctime
ファイルが作成された時刻。NTFS では有効ですが、FAT フォーマットのディスク ドライブでは無効です。
st_mtime
ファイルが最後に変更された時刻。

Windowsではctimeが作成時刻らしい。ただしNTFSのみでFATはだめらしい。

Macの場合

わからん。