2005年10月17日
川俣晶の縁側ソフトウェア技術雑記 total 10900 count

":"は正当なパスの一部だ! NTFSファイルシステムの複数ストリームをお手軽に体験する

Written By: 川俣 晶連絡先

 System.IO.Path.Combineメソッドにおいて、ファイル作成に使用できない文字に対して例外を投げる場合と投げない場合がある問題を書いたとき、調査不十分で間違ったことを書いてしまいました。

 その件を、Orator/魔界の仮面弁士さんの[.NET]System.IO.Path.Combineでコロンが許可されている理由より突っ込まれてしまいました。(突っ込み感謝)

 というわけで、NTFSにおいて":"が正常なファイル名の一部であることを、極めてお手軽にコマンドライン上で確認してみました。環境はWindows XP SP2です。

名前のあるストリームの読み書き §

 NTFSのファイルは、1つのファイルに複数のストリームを格納できます。

 主に使用されるのは名前の無いストリームで、ほとんどのケースで読み書きの対象となるのはこれです。それに対して、名前を明示的に付けたストリームも作成することができます。

 ":"記号は、ストリームの名前を区切るために使用します。

 たとえば、test.txtの名前のないストリームにアクセスするには"test.txt"と記述しますが、test.txtのsampleという名前のストリームにアクセスするには"test.txt:sample"と記述します。

 実際に使った例を以下に示します。

D:\delme\stream>echo 名前のないストリーム >test.txt

D:\delme\stream>echo sampleストリーム >test.txt:sample

D:\delme\stream>cat <test.txt

名前のないストリーム

D:\delme\stream>cat <test.txt:sample

sampleストリーム

 出力のため、最初はtypeを試したのですが、ストリーム名が使えなかったのでcatで代用しました。ちなみに、このcatは、NT版UNIX-like toolsのcatです。

 というわけで、複数ストリームを使うというのは、何やら難しそうだと思ってずっと後回しにしてきましたが、印象に反して非常に簡単であることが確認できました。また、":"が自然なパスの一部として使用される文字であることも確認できました。

複数ストリームのコピー §

 複数のストリームを持ったファイルをコピーしたとき、全てのストリームが正しく複製されるのでしょうか?

 ついでなので、ちょっと確認。

D:\delme\stream>copy test.txt test2.txt

        1 個のファイルをコピーしました。

D:\delme\stream>cat <test2.txt

名前のないストリーム

D:\delme\stream>cat <test2.txt:sample

sampleストリーム

D:\delme\stream>cat test.txt >test3.txt

D:\delme\stream>cat <test3.txt

名前のないストリーム

D:\delme\stream>cat <test3.txt:sample

指定されたファイルが見つかりません。

 copyコマンドによるコピーは問題なくOK。2つのストリームがいずれもコピーされています。

 しかし、catとリダイレクトによるコピーは名前のないストリームしかコピーされていません。これはやむを得ませんね。リダイレクトを経由するストリームは1つしか存在しないわけで、複数のストリームを複製することは著しく困難でしょう。

ファイルのサイズ §

 もっと余談。

 ファイルのサイズは、名前のないストリームのサイズのみが示されるようです。つまり、名前のあるストリームがあってもなくても、表示上は同じサイズに見えます。

D:\delme\stream>dir

 ドライブ D のボリューム ラベルは tailmon1b です

 ボリューム シリアル番号は 50D4-1977 です

 D:\delme\stream のディレクトリ

2005/10/17  15:22    <DIR>          .

2005/10/17  15:22    <DIR>          ..

2005/10/17  15:21                23 test.txt

2005/10/17  15:21                23 test2.txt

2005/10/17  15:22                23 test3.txt

               3 個のファイル                  69 バイト

               2 個のディレクトリ   6,449,672,192 バイトの空き領域

 ちなみに、du for Win32も、名前のないストリームしかカウントしていないことが発覚。こりゃ、直さないといかんなぁ。しかし、いつ時間が取れるかな? (とほほ)

壁のLinaさん作のNTUpdateはどうだ? §

 ここまで来ると、バックアップに日常的に使っている壁のLinaさん作のNTUpdateは名前のあるストリームをバックアップしているか気になります。そこで試してみました。

 (注: こちらで使用しているのは、独自にUnicode対応した版で公開されていないもの)

D:\delme>ntupdate d:\delme\stream d:\delme\streamDest

NTUpdate  -  File Compare Backup Utility  for Windows 2000 Plateforme

                                              Ver.1.00.0.0 Beta 07 , 2000.08.27

                                   Copyright(c) by. Lina.Inverse / Lapis.Lazuli

Unicode Enabling Version by autumn. Sep.29,2000

(中略)

D:\delme>cd streamDest

D:\delme\streamDest>cat <test.txt

名前のないストリーム

D:\delme\streamDest>cat <test.txt:sample

sampleストリーム

 ちゃんとコピーされていることが分かりました。偉いぞ壁のLinaさん!

2006年7月18日追記・ディレクトリのストリーム §

 NTFS代替データストリームはディレクトリにも作成できるによると、ディレクトリにも名前のあるストリームを作成でき、それがセキュリティのリスクとして認識されているようです。