FILETIME Extractor (fte)

[バージョン]
FILETIME Extractor (fte) v1.3

[ライセンス]
GPL (v3)

[動作環境]
Windows 2000/XP/2003/Vista/2008/7
(*32/64bit版両方で動作します)

[基本的な使い方]
> fte.exe ファイル名
指定ファイルのタイムスタンプを標準出力に表示します。

[オプション]

  • -e: CSVに似た(パイプ"|"を区切り文字とした)形式で出力します。
  • -i: 日付/時刻をISO 8601形式で出力します。デフォルトは"年/月/日 時:分:秒.秒未満9桁"の形式で出力します。
  • -l: このオプションを指定した場合、引数に指定されたファイルをリストとして扱い、リストに記載されたファイルのタイムスタンプを出力します。リストは1行1ファイル(パス)で書かれていることを想定しています。
  • -r: 指定ディレクトリ/ボリューム配下を再帰処理します。ボリューム指定時にエラーが出る場合は"C:\*"のようにアスタリスクをつけて実行してください。
  • -u: UTC(協定世界時)で表示します。デフォルトはPCに設定されているタイムゾーンに準じて時間表示します。

[特徴]

  • WinAPIを使って普通に情報を取り出すシンプルなプログラムです。
  • NTFSで各ファイルが保持する4つのタイムスタンプをすべて取得します。
  • 秒未満の値も算出して表示します。
  • 対象がFAT, exFAT, SMBなどを使ったネットワークドライブでも可能な範囲、精度で取得します。
  • $MFTなどのInternalなファイルのタイムスタンプも取得します。
  • 取得したタイムスタンプから元の型を推測し表示します。
  • ファイルがObject IDを保持している場合、パースして各種情報を表示します。

[制約]

  • 可能な限りファイルをオープンしようとしますが、プロセス使用中などオープンできなかった場合はエラーが返ります。
  • 削除済ファイルのタイムスタンプは取得できません。
  • Unicodeには対応できていません。
  • -lオプション利用時のリストファイルは、先頭に余分なスペースが含まれているとうまく動きません。
  • リストファイルの改行コードがCR(Macの古い環境?)の場合、うまく動きません。

[注意]
こちらの環境で確認した限りでは、Unix系ファイルシステム上のファイルのタイムスタンプをネットワーク経由で参照すると
ctimeは本来の値ではなくmtimeと同じ値にセットされていました。crtimeはファイルによってmtimeと同じ場合もあれば
atimeと同じ場合もありよくわかっていません。また、ファイル共有サーバの実装によっては正しい値を返すかもしれません。

[ファイル名]
fte_1.3.zip (MD5: 3454b464b4f5e37afcb5b0be8ee2fb0c) - バイナリ
fte_1.21.zip (MD5: ccdf8e8937b9e430cc7f8c73f2d1b0d5)
fte_1.3_src.zip (MD5: b8a7bccb074a4492eb28ee87605121a9) - ソース
fte_1.21_src.zip (MD5: 5738e453f8f168e8be5b8b74101a4fd5)

(追記: 2009/12/02)
早速CCIさんからフィードバックもらい微修正しました。ありがとうございます。

(追記: 2009/12/05)
コメントをいただきVista以前の環境でも動かせるようになりました。ありがとうございます。

[Note]
2010/04/18: オブジェクトIDのパース処理を追加(1.3)
2010/01/03: ワイルドカード処理の不備を修正(1.21)
2009/12/14: ワイルドカード、-rオプション、型推測処理を追加(1.2)
2009/12/05: 2000/XP/2003に対応(1.02)
2009/12/02: -lオプションの処理を修正(1.01)
2009/12/01: とりあえず公開(1.0)

AttachmentSize
fte_1.21.zip54.43 KB
fte_1.21_src.zip34.22 KB
fte_1.3_src.zip35.14 KB
fte_1.3.zip54.16 KB

コメント

XP/2003用にWin32 FileID API

XP/2003用にWin32 FileID API Libraryを使ってはどうでしょうか
http://www.microsoft.com/downloads/details.aspx?FamilyId=1DECC547-AB00-4...
_WIN32_WINNTを低めに設定してwinbase.hで定義されないようにすればコンパイル通りました
手元では動いてるようです

kazamiya

コメントありがとうございます。

こういうライブラリがあるのは初めて知りました。こちらの定義を変えておけば、XPなどでも追加ライブラリで動かせるということなんですね。早速採用させていただこうと思います。

cci

以下の部分みたいです。CR/LFであれば終端文字にする、という修正でどうでしょう?
// chomp CR/LF
buf[strlen(buf)-1]='\0';
FILETIMEExt(buf);

kazamiya

確認したところ少し前のソースとバイナリをあげていました。。早速修正版をUPしましたので前のは消去しちゃってください。

改行コードがCR/LFかLFだとうまく動くと思います。fgetsはCR onlyだと区切ってくれないようで、そこを直すのは面倒なので後回しにします。

kazamiya

む、早速ありがとうございます。確認してみます。

まさにそこは面倒なので手抜き実装したところです..自分の環境ではSJIS+CR/LFでたいてい動いていたんですが、改行コードはそれ以外だったりしませんかね。

どちらにしてもどの改行文字でも対応できたほうがいいのでTODOに入れておきます。
# プログラミングスキルに乏しいのですぐ直せる自信がありません..w

cci

zakiさん、フィードバック返しします。
-lオプションで、例えば以下のパス情報を含むテキストファイルを食わせると、「Can't open C:\config.sy, CODE=2:指定されたファイルが見つかりません。」と言われます。

C:\autoexec.bat
C:\config.sys

おそらくうっかり系の問題のようですが・・環境はWindows 7 Ultimateです。