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