C#とNTFSストリームの甘くない関係スマートフォン専用ページを表示ぬるり。毎度すっかり更新がおろそかになっています。今回はすぐコードというわけではないですが、NTFSストリームを調べる方法の考察。NT系で採用されているファイルシステムNTFSには、ストリームという概念があります。一つのファイルに対して複数の情報を持たせることができる仕組みです。ファイルのプロパティの概要タブで色々情報を書き込むことができますが、これはNTFSストリームを利用して実現されています。ストリームへのアクセスは、[ファイル名]:[ストリーム名]で行います。hoge.txt:Userと書くだけでも可能です。echoコマンドで出力されるHongliangをhoge.txt:Userというファイルにリダイレクトで書き出すわけですね。typeコマンドはNTFSストリームには対応していないようなので、より一般的にはWSHでFileSystemObjectを使用して読み書きするのが良いでしょう。普通にファイルのように扱えます。難点は、あるファイルにどんなストリームが存在するかを確認する手段がないっぽいことです。APIプログラミングには、二通りのアクセス方法があるようです。一つはBackupRead/BackupWrite関数を使うやり方。一つはIPropertySetStorageというCOMインターフェイスを中心としたやり方です。このうち、BackupRead系は、比較的単純です。ファイルに存在する全てのストリームが並べられ、それぞれのストリームにヘッダが用意され、プログラマはそのヘッダを利用してストリームを判断することになります。これを使った場合、先に挙げた「ファイルのプロパティの概要タブで色々書き込まれた情報」にはまともにアクセスできません。それがバイナリデータになっているからです。一つのIPropertySetStorageインターフェイス絡みの方にはもっと頭の痛い問題があります。C#で定義したIPropertySetStorageのメソッドが巧く動かないのです。StgOpenStorageEx関数を使用してIPropertySetStorageを取得します。これは問題ありません。見つかりませんでした(STG_E_FILENOTFOUND)」という例外が投げられるんです。これには困り果てました。等価の(はずの)コードをC++で書くと問題なく成功するのですから。ん〜、なにかCOMインターフェイスの宣言に不味いところがあるんでしょうか......。PreserveSig属性をつけたらAccessViolationExceptionが出るようになるし。C++で書くか?その後色々と勉強して、不可能ではないことが分かりました。そちらを参照してください。[必須入力]※画像の中の文字を半角で入力してください。この記事へのトラックバックリンクしました。12:19ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。あ、こんなのに使ったってコメントを頂ければ嬉しいです。Seesaaブログ×この広告は180日以上新しい記事の投稿がないブログに表示されております。