2006 年 11 月 3 日 16 時 50 分

色々なファイルパスを試してみる


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


実際に拡張表現を試してみよう。

サンプルとして、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 は、
ファイルだけでなく、デバイスへのアクセス構文を持ち、

この機能は、ファイルを開くプログラムで、
標準的に使うことができるということがわかる。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.