2006 年 6 月 26 日 22 時 37 分

ファイルサイズの表示


このアーカイブは同期化されません。 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:\ を開いて、「バイトサイズ」を表示させてみよう。
よし、いい感じで表示されているようだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.