トップ «前の日記(2008-09-07) 最新 次の日記(2008-09-09)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2008-09-08

_ atimeの謎

ctimeとmtimeはわかるが、atimeが謎だ。
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は変わらない。ファイルからデータを読み込んでも変わらない。

MSDNによれば

File.GetLastAccessTime メソッド 指定したファイルまたはディレクトリに最後にアクセスした日付と時刻を返します。

となっているが、上の結果からそれは正しくないという結論となる。

Rubyのatimeだからか?

Explorer's property

そんなことはない。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を更新するメソッドが必要だということになる。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|

ジェズイットを見習え