個人的なメモ勉強用
c:\windows\system32\wscript.exe
\?\GLOBALROOT\Device\HarddiskVolume1\windows32\wscript.exe
実際に拡張表現を試してみよう。
サンプルとして、Windows フォルダ内にある、
win.ini にアクセスしてみよう。
エクスプローラのアドレスバーや、
ファイルを開く汎用コモンダイアログでは、
拡張パス表現に対する対応をしているが、
コマンドプロンプトや「ファイルを指定して実行」は、
そのような制限がないため、入力して試すことが可能だ。
では、コマンドプロンプトを開き、
そこに入力して試してみよう。
ここでは、わざわざメモ帳を起動して試す。
ファイルの中身を書き出す type コマンドもあるが、
このコマンドは、パスに対して特別な処理をしているので、
テストとしては不適当なのだ。
最初は、普通にファイルの中身を表示してみよう。
> notepad "C:\WINDOWS\win.ini"
メモ帳が起動し、ファイルが表示されたと思う。
次に、パス記号を変えてみる。
> notepad "C:/WINDOWS/win.ini"
Windows のパスとしては不適当な文字なのだが、
ファイル名の正規化によって / が \ と解釈され、
正常に開くことができることが確認できる。
続いて、メタ表記を使ってみよう。
> notepad "C:/WINDOWS/../WINDOWS\win.ini"
一度上のディレクトリに移動してから再度戻るパスで、
ディレクトリ区切り記号を混在させても大丈夫である。
そして、余計な文字を追加して試して見る。
> notepad "C:/WINDOWS./win.ini.... .. . ."
ディレクトリ名の後にある 1 つのドット記号や、
ファイル名の後にある任意数のドットや空白は、
正規化によって除去されることが分かる。
さて、では拡張表現を使ってみよう。
> notepad "\\?\C:\WINDOWS\win.ini"
実は、これもちゃんと開くことができる。
メモ帳がファイルを開く際には、受け取ったパスを
ファイルを扱う API にそのまま渡しているからである。
では、ファイルを開いた後、ファイルメニューより
「名前をつけて保存」を選んでみよう。
「コモンダイアログエラー」という珍しいメッセージが出る。
メモ帳がファイルを保存する際は、
現在のファイル名を元にコモンダイアログを表示するが、
コモンダイアログでは安全のため拡張表現を受け付けず、
ダイアログを表示する際にエラーとしてあるのである。
次に、拡張表現で、パス記号などを変えてみよう。
> notepad "\\?\C:/WINDOWS/win.ini"
> notepad "\\?\C:\WINDOWS\win.ini."
これらの場合は開くことができない。
\?\ によって正規化が抑制されているので、
上の場合は、「C:/WINDOWS/win.ini」というファイル名、
下の場合は、「win.ini.」というファイル名とみなされ、
ファイルが見つからないと言うエラーとなる。
拡張表現では、C: など、一般的な名前以外の、
DOS デバイス名前空間 (??) の名前も使うことができる。
例えば、?? 空間には、GLOBALROOT という名前があり、
これは、デバイス名前空間のルートへのリンクである。
そのため、GLOBALROOT を経由すると、
あらゆるデバイスパスを使ってアクセスすることができる。
例えば、C: ドライブが、最初のハードディスクの、
最初のパーティションに存在すると仮定すると、
デバイスパスは \Device\Harddisk0\Partition1 である。
このパスを使ってファイルにアクセスするとこうなる。
> notepad "\\?\GLOBALROOT\Device\Harddisk0\Partition1\WINDOWS\win.ini"
長いパスではあるが、これでもちゃんと表示されたはずだ。
GLOBALROOT から、再度 ?? に戻ることもできる。
> notepad \\?\GLOBALROOT\??\C:\WINDOWS\win.ini
これも問題なく表示されたと思う。
このように、ファイルアクセス用の API は、
ファイルだけでなく、デバイスへのアクセス構文を持ち、
この機能は、ファイルを開くプログラムで、
標準的に使うことができるということがわかる。