このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
今日はちゃんとファイルサイズを表示してみよう。
ColumnProvider.cs を開き、
GetColumnInfo の一部を以下のように書き換える。
// カラムの情報を設定する
psci.scid.fmtid = FORMAT_ID;
psci.scid.pid = PROPERTY_ID;
psci.vt = VARTYPE.I8;
psci.fmt = LVCFMT.RIGHT;
psci.cChars = 10;
psci.csFlags = SHCOLSTATE.TYPE_INT | SHCOLSTATE.SLOW;
psci.wszTitle = "バイトサイズ";
psci.wszDescription = "バイト単位のファイルサイズ";
.NET で取得するファイルサイズは long 型だ。
long 型は符号付の 8 バイト整数なので、VARTYPE.I8 だ。
数値は右寄せが一般的なので、LVCFMT.RIGHT を指定する。
csFlags には数値順ソートの SHCOLSTATE.TYPE_INT の他に、
SHCOLSTATE.SLOW も指定している。
SHCOLSTATE.SLOW は、ファイルの情報の取得に、
ある程度の時間がかかる際に指定する。
つまり、GetItemData メソッドがすぐに戻らない場合は、
SHCOLSTATE.SLOW を指定することが推奨されるのだ。
SHCOLSTATE.SLOW が指定されていれば、
エクスプローラはカラム情報の取得のために
新しいスレッドを生成して処理を行うので、
ユーザに対するレスポンスの悪さをカバーできるのだ。
今回は、ファイルのサイズだけなので、遅くはないが、
まあ、指定しておいてもいいだろう。
そして、GetItemData を変更する。
// 識別子を調べる
if (pscid.fmtid != FORMAT_ID || pscid.pid != PROPERTY_ID) {
throw new ComFalseException();
}
// ディレクトリにはサイズ情報はない
if ((pscd.dwFileAttributes & FILE_ATTRIBUTE.DIRECTORY) != 0) {
throw new ComFalseException();
}
// ファイルサイズを得る
pvarData = new FileInfo(pscd.wszFile).Length;
pscd 引数には、ファイル名だけでなく、
幾つかの情報が入っているので、上手く利用しよう。
dwFileAttributes には、ファイルの属性が格納されている。
フォルダにはサイズがないため、フォルダであれば除外する。
フォルダは FILE_ATTRIBUTE.DIRECTORY で判別可能だ。
ファイルのサイズは、System.IO 名前空間にある、
FileInfo クラスを使って取得し、pvarData に代入する。
Length プロパティは、long 型なので、
pvarData には long がボックス化されて格納される。
これは、COM 呼び出しの際に、I8 の VARIANT に変換される。
よし、テストをしてみよう。プロジェクトをビルドする。
すると、以下のエラーが発生した。
--------------------------------------------------------
ファイル 'LoaferShellEx.dll' を実行ディレクトリにコピーできません。 プロセスはファイルにアクセスできません。別のプロセスが使用中です。
--------------------------------------------------------
エクスプローラによって使用されるハンドラは、
explorer.exe によってロードされるため、
状況によっては、explorer.exe のプロセスが
LoaferShellEx.dll を使用中である可能性があるのだ。
この場合、unreg.reg を使って登録解除し、
一度ログオフして explorer.exe を終了させ、
再度ログオンしてから作業するのが正当なのだが、
面倒くさいので、タスクマネージャから殺すことにしよう。
explorer.exe が消えればタスクバーも消えるが、
アプリケーションは正常に動いているので、
最小化していても Alt + Tab で切り替えることができる。
この状態でビルドすれば、正常に成功するはずだ。
そして、タスクマネージャから、
explorer を実行し、元の状態に戻す。
さて、C:\ を開いて、「バイトサイズ」を表示させてみよう。
よし、いい感じで表示されているようだ。