現在地

fte(cmd)

久しぶりにコードを見直しUnicode化&ファイルID取得するようにしました。
# Unicode化してもコマンドプロンプトではANSIで入出力されているようで、かつchcpを試しても変わらず???ですが..

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

[ライセンス]
GPL (v3)

[動作環境]
Windows XP/2003/Vista/2008/7 (x86/x64)

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

[オプション]

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

[特徴]

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

[制約]

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

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

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

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

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

[Note]
2011/04/11: ファイルID取得の追加、マルチバイト/Unicode対応のコードに変更(1.4)
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)

添付サイズ
fte_1.4.zip69.51 KB
fte_1.3.zip54.16 KB
fte_1.21.zip54.43 KB
fte_1.4_src.zip44.58 KB
fte_1.3_src.zip35.14 KB
fte_1.21_src.zip34.22 KB

コメント

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

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

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

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

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

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

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

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

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

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

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

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