ファイルのアクセス日時に使い道はあるのか

タイトルは誇張です。（良いのが思いつかなかった）

## ファイルのアクセス日時

### Windowsの場合
Linuxだとアクセス日時って普段あまり見ないけれど、
Windowsだとファイルのプロパティを見ると、「作成日時」「更新日時」「アクセス日時」と並んでいるので目にする機会は多いと思います。

最近気が付いたのですが、以下のように作成日＝アクセス日時となっており、これって意味はあるの？と思って調べたので、わかったことをまとめておきます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/27443/d3bca2ba-1807-9996-658a-9b4f89df2bb4.png)

### Linuxの場合
Linuxでは`atime`(access time=最終アクセス日時)と呼ぶようです。
`stat`コマンドで1ファイル単位で見るか、`ls`コマンドの`-u`オプションで他のファイルもまとめて見られます。

```terminal:stat
kajiken@kajiken:~/mydir$ stat hoge
  File: 'hoge'
  Size: 1015            Blocks: 8          IO Block: 4096   通常ファイル
Device: fd01h/64769d    Inode: 262533      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ kajiken)   Gid: ( 1000/ kajiken)
Access: 2016-05-06 10:23:03.207945443 +0900
Modify: 2016-05-06 10:23:02.331956456 +0900
Change: 2018-09-05 00:37:42.919406853 +0900
 Birth: -
kajiken@kajiken:~/mydir$ 
```

```terminal:ls
kajiken@kajiken:~/mydir$ ls -lutr --full-time
合計 12
-rw-r--r-- 1 kajiken kajiken 1015 2016-05-06 10:23:03.207945443 +0900 hoge
-rw-r--r-- 1 kajiken kajiken   48 2018-09-04 14:07:53.375885280 +0900 fuga
-rw-r--r-- 1 kajiken kajiken  212 2018-09-04 23:51:44.451868595 +0900 piyo
-rw-r--r-- 1 kajiken kajiken    0 2018-09-05 00:38:03.327188352 +0900 hogera
kajiken@kajiken:~/mydir$ 
```

## アクセス日時が更新されるタイミング

### Windowsの場合

昔は開いただけで変わってたような気がしたんですが、今は**開いても更新しても変わらない**。
調べてみると、Vistaからデフォルトで無効になっているようです。
公式ではWindows 2000の情報しか見つからなかったので、2000のを貼っておきます。
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-2000-server/cc959914(v=technet.10)

* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate

|値|意味|
|---|---|
|0|ディレクトリを一覧表示すると、NTFSは検出した各ディレクトリの最終アクセスタイムスタンプを更新し、NTFSログに変更が記録されるたびに記録します。|
|1|ディレクトリを一覧表示すると、NTFSは最終アクセスタイムスタンプを更新せず、タイムスタンプ更新をNTFSログに記録しません。(デフォルト)|

うちのWindows 10のレジストリを見てみると、1でも0でもなく、0x80000003になってました。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/27443/add2e2ed-0e42-79cb-b766-b017b8e61311.png)

実は最近、Windows 10 の1803で仕様が追加されたようです。
情報元はフォーラムであって、公式資料とは異なりますが、例のごとく日本語では見つからなかったので…。
https://answers.microsoft.com/ja-jp/windows/forum/windows_10-performance/windows-10/ec6995c7-d9e3-4564-9be8-ec07fe04bffc

* HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate

|値(FsUtil)|値(レジストリ)|意味|
|---|---|---|
|0|0x80000000|ユーザー管理、最終アクセス日時を更新する|
|1|0x80000001|ユーザー管理、最終アクセス日時を更新しない|
|2|0x80000002|システム管理、最終アクセス日時を更新する|
|3|0x80000003|システム管理、最終アクセス日時を更新しない(デフォルト)|

参照や変更はレジストリエディタで良いけど、管理者権限で開いたコマンドプロンプト(FsUtil)でも可能。

```terminal
Microsoft Windows [Version 10.0.17134.254]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>FsUtil behavior
---- サポートされている BEHAVIOR コマンド ----

query           ファイル システムの behavior パラメーターを照会
set             ファイル システムの behavior パラメーターを変更

C:\WINDOWS\system32>
C:\WINDOWS\system32>FsUtil behavior query disablelastaccess
DisableLastAccess = 3  (システム管理、有効)

C:\WINDOWS\system32>
C:\WINDOWS\system32>FsUtil behavior set disablelastaccess 0
DisableLastAccess = 0  (ユーザー管理、無効)

C:\WINDOWS\system32>
C:\WINDOWS\system32>FsUtil behavior query disablelastaccess
DisableLastAccess = 0  (ユーザー管理、無効)

C:\WINDOWS\system32>
C:\WINDOWS\system32>FsUtil behavior set disablelastaccess 3
DisableLastAccess = 3  (システム管理、有効)

C:\WINDOWS\system32>
```

### Linuxの場合

Linuxの場合は、ファイルのreadが行われた場合に更新される。
うちの場合はcatで変わりましたが、変わらない場合はマウントオプションにnoatimeを付けていると思います。

```
kajiken@kajiken:~/mydir$ cat hoge
　：(ファイルの内容)
kajiken@kajiken:~/mydir$ 
kajiken@kajiken:~/mydir$ stat hoge
  File: 'hoge'
  Size: 1015            Blocks: 8          IO Block: 4096   通常ファイル
Device: fd01h/64769d    Inode: 262533      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/ kajiken)   Gid: ( 1000/ kajiken)
Access: 2018-09-05 01:47:03.067046096 +0900
Modify: 2016-05-06 10:23:02.331956456 +0900
Change: 2018-09-05 00:37:42.919406853 +0900
 Birth: -
kajiken@kajiken:~/mydir$ 
```

atimeの更新が入るとパフォーマンスが出ないので、noatime付けている人も多いかと思います。

## アクセス日時の使い道

誰かに見られていないか、or ちゃんと見たかを確認する…。
システム的に使ってたかどうか忘れたゴミファイルを安心して消せる？(grepしろよ…)
一部メールチェックやバックアップシステムでは使っている(いた？)ようですが…。

良い使い道が思いつかない。

調べてみると、こんな情報を見つけました。
英語力がないので後半は意訳です。(正しく翻訳できる方お願いします): 


> atimeの更新は、Linuxが現在持っているI/Oパフォーマンスの最大の欠点です。
atimeの更新を取り除くと、過去10年間のページキャッシュのスピードアップよりも、日々のLinuxのパフォーマンスが向上します。

>おそらく、すべての時代の最も愚かなUnixの設計思想でもあります。
Unixは本当にうまくやっていますが、これについて少し考えてみてください。

>>あらゆるファイルはディスクから読まれます。
…(atimeのために)ディスクに書かれます！

>> そして、ファイルがキャッシュされ、キャッシュされたファイルを私たちが読み込みます。
…(atimeのために)ディスクに書かれます！

>https://lwn.net/Articles/244830/

Ingo Molnar 氏 は Linuxカーネルの開発メンバーです。

この後、Linusの提案でatimeは遅延書き込みするとかあったみたいですが、
そこからrelatimeが出てきたのでは？と思います。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/power_management_guide/relatime

Microsoft(Windows)も遅延反映させているような記述もあります。
https://docs.microsoft.com/ja-jp/windows/desktop/SysInfo/file-times

アクセス日時は今後どうなっていくいんでしょうかね。