IAttachmentExecute と ZoneId と副次ストリーム

XP SP2からIEでファイルをダウンロードした後、開こうとすると警告が出るようになったのは皆さんご存じの通りだと思うのだが、この警告はタイトルの通りのAPIを使って実装されている。

Firefox 3 でも上記のAPIを使ってダウンロードしたファイルに警告が出るように実装された(Bug 408153)。

この機能はNTFSファイルシステムの副次ストリーム(ADS)が使われている。この副次ストリームというのがクセ物で表面上0KBのファイルでも実は100GBあった、なんてことができるようになっている。

コマンド プロンプトを開いて、

notepad <ダウンロードしたファイル>:Zone.Identifier

とやってみると以下の通り、警告機能で使われている副次ストリームの内容が確認できる。

[ZoneTransfer]
ZoneId=3

簡単に言うと、ファイルに小さい金魚のフンがくっついたような感じになっている。

メモ帳に上の副次ストリームの内容を保存してみて、ファイルのプロパティを開いてみよう。サイズは24バイトとなっているがディスク上のサイズは4KBとなってしまっている。

4KB × 10000ファイル = 約39メガバイトとなる。

今回言いたかったのはちりも積もれば山となる、この小さな副次ストリームが何百何千ファイルもあればそれなりにディスクを食うようになってるんじゃないかということだったんだけど、どうやら調べてみるとADSはMFTレコード内に内包されているらしくてディスク容量にはあまり関係ないらしい。がっくり。

それでもファイルを開く時、メッセージボックスがいちいち鬱陶しい!でもダウンロードしたファイルは何千もある!という場合はAttributerというツールがあるのでこれを使って一括削除するとよい。