著作一覧 |
c:\home\arton>irb irb(main):001:0> File.open('b', 'w').close => nil irb(main):002:0> "#{File.ctime('b')}, #{File.mtime('b')}, #{File.atime('b')}" => "2008-09-08 00:58:10 +0900, 2008-09-08 00:58:10 +0900, 2008-09-08 00:58:10 +0 900" irb(main):003:0> File.open('b', 'a') {|f| f.puts } => nil irb(main):004:0> "#{File.ctime('b')}, #{File.mtime('b')}, #{File.atime('b')}" => "2008-09-08 00:58:10 +0900, 2008-09-08 00:58:58 +0900, 2008-09-08 00:58:10 +0 900" irb(main):005:0> IO::read('b') => "\n" irb(main):006:0> "#{File.ctime('b')}, #{File.mtime('b')}, #{File.atime('b')}" => "2008-09-08 00:58:10 +0900, 2008-09-08 00:58:58 +0900, 2008-09-08 00:58:10 +0 900" irb(main):007:0>
ファイルを作るとctime、mtime、atimeに同一時刻が入る。それは当然のこととして。
ファイルへ書き出すと、mtimeが変化する。modified timeだろうからそれも当然だ。
でも、書きだすということは、アクセスはしているわけだが、atimeは変わらない。ファイルからデータを読み込んでも変わらない。
File.GetLastAccessTime メソッド 指定したファイルまたはディレクトリに最後にアクセスした日付と時刻を返します。
となっているが、上の結果からそれは正しくないという結論となる。
Rubyのatimeだからか?
そんなことはない。Rubyであってもファイルシステムから時刻情報を読み込んでいるのだから、元の値がそうなっているということなのだ。
それだけならばまだいいが
irb(main):007:0> File.delete 'b' => 1 irb(main):008:0> File.exist?('b') => false irb(main):009:0> File.open('b', 'w').close => nil irb(main):010:0> "#{File.ctime('b')}, #{File.mtime('b')}, #{File.atime('b')}" => "2008-09-08 00:58:10 +0900, 2008-09-08 01:08:17 +0900, 2008-09-08 01:08:17 +0 900" irb(main):011:0>
実は、ctimeはファイルの単純な作成時刻ではない。同一ディレクトリ上に最初に同名のファイルを作ったの時刻がctimeなのだ。それに対してatimeは、そのファイルのインスタンスを作った時刻となる。
調べると、ウィルスバスターなどが検査を完了した時刻をatimeに設定していたりする。
したがって、atimeというのは上で引用したMSDNの説明のように単に最後にアクセスした時刻ということではなく、「特定のアプリケーションがファイルにアクセスした時刻」をログするためのフィールドということになる。初期化されるのは、そのファイルのインスタンスを作成した時点だ。
少なくともWin32(NTFS)ではそのようになっている。
現在、File#atime=(time)や、File.atime=(time)メソッドは未定義のようだが、Win32のファイルシステムを扱うには、atimeを更新するメソッドが必要だということになる。
ジェズイットを見習え |