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
- ファイルが最後に変更された時刻。
(from MSDN ホームページ)
Macの場合
わからん。