以前、こちらの記事で以下の事を書いたのですが、これは間違いでした。ごめんなさい(´・ω・`)。
2. GetFileInformationByHandleで取得するBY_HANDLE_FILE_INFORMATIONのnFileIndexHigh, nFileINdexLowを参照する。こちらは再起動、ボリュームのマウントしなおしで値が変わります。
Windows2008R2で再起動、再マウントでファイルシステムがNTFSの場合、変わらないことを確認しました。ではどういう時に変わるのかというと、ファイルシステムがFAT系(FAT, FAT32)の時にRenameをし、そのRenameによって名前が長くなったり、ディレクトリ内の順番が変わったりするような場合に変わりました。
(NTFSでも別ボリュームへ移動した場合は変わります(※1))
また、同一性の判定については、nFileIndexHighとnFileINdexLowだけでは不十分で、dwVolumeSerialNumber も合わせて比較する必要があります。まぁ別ボリュームでnFileIndexHighとnFileINdexLowが一致するって事はレアケースだとは思いますが、完全ではないので。
MSDNのRemarkのところに記述があります。
なので、ローテーションされているログをTAILで追跡するような場合、以下の前提が必要になります。
- NTFSファイルシステムであること
- ローテーション先が同一ボリュームであること
※1について
NTFSで別ボリュームに移動した場合でも追跡したい場合はDeviceIOCtrlを使う必要があります。
確認したOS
確認したOSはWindows2008R2です。
2008R2はNTカーネル6.1なのでWindows7と同等のカーネルです。一応主要OSのNTバージョンを表にしておきます。
NT Version | OS |
---|---|
NT 5.1 | Windows XP |
NT 5.2 | Windows Server 2003 |
NT 5.2 | Windows XP (64bit) |
NT 6.0 | Windows Vista |
NT 6.0 | Windows Server 2008 |
NT 6.1 | Windows 7 |
NT 6.1 | Windows Server 2008 R2 |
NT 6.2 | Windows 8 |
NT 6.2 | Windows Server 2012 |
NT 6.3 | Windows 8.1 |
NT 6.3 | Windows Server 2012 R2 |
手元で確認できるのは、XPとVistaとWin7、EC2上でWindowsServer2008, 2012があるのでもうちょっと別のOSで確認してみます。(-_- )ウーン・・
2003はEC2に無いので無理です。
※追記(2013/12/19 11:00) EC2にWindows Server 2003ありました。QuickStartに出てこないだけで普通にありました。ごめんなさい。
また何かわかったら書きます。
いや、全然違うよ!正しくはこうだよって指摘がありましたらツッコミよろしくお願いします。