2017年11月30日
川俣晶の縁側ソフトウェア技術雑記 total 3043 count

Windowsの絶対パスとは何か・実は解釈が割れている

Written By: 川俣 晶連絡先

「少し言いたいことができたので、簡単にまとめる」

「それはなんだい?」

「絶対パスとは何か」

「相対パスじゃないものが絶対パスでは?」

「そうすると、今度は相対パスを定義しなければならない」

「じゃあそもそも絶対パスってなんだ?」

「第1の定義は以下のようなもの」

http://e-words.jp/w/%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9.htmlより

装置内の最上位階層から目的のファイルやフォルダまでのすべての道筋を記述する方式を「絶対パス」という。

「ふむふむ」

「この場合、”c:test"は絶対パスにならない。"\test"は絶対パスになる」

「"\test"はドライブ名不詳だね」

「しかし、これも絶対パスになる。これがMS-DOSからWindowsに続く、昔ながら定義」

「それで?」

「しかし、"\test"はカレントドライブに相対だから絶対パスと呼びたくはないという人がいる」

「どこに?」

「このあたりに」

https://dobon.net/vb/dotnet/file/isabsolutepath.htmlより

この内「\」で始まるパスは、通常相対パスと判断したいところですので

「なぜそう思うのだろう」

「おそらく、URIの絶対パスの考え方からすると、たった1つのリソースを指定できない表記方法は絶対パスとは言えない……と思うのだろう」

「じゃあ、昔ながらの定義は間違っているわけ?」

「そうじゃない。昔ながらのシステムというのはフロッピーディスクが前提だから、メディアはドライブを変えて差し込めば、どんどんドライブレターが変化していく。そこは、リソースがたまたま存在するドライブを指定するものであって、リソース名を一意に指定するものではないのだよ」

「じゃあ、ハードディスクが使用されている今はもう意味が無い?」

「そんなことはない。USBメモリを同じマシンに刺しても条件次第で同じドライブレターにならない可能性はあるし、まして他のマシンに刺したら同じになる必然性は無い」

「じゃあ、装置内で一意というだけで絶対パスと呼ぶことにも一理はある?」

「あると思うよ。まあ厳密に言うと、装置という言い方は曖昧で良くないけどね」

「なぜ?」

「1つの物理デバイスに複数のドライブを確保できるからさ」

「ぎゃふん」

まとめ §

  • 絶対パスの考え方は、MS-DOS/WindowsとURIでは異なっている。混ぜて考えるとおかしくなる
  • MS-DOS/Windowsの絶対パスは定義が存在していて、それに沿ってAPIが実装されてきた過去がある。今更変えられないし、その定義はそれなりの理由がある。単純に間違いと断言しても問題は解決しない
  • URIの絶対パスは定義はRFCに存在し、それに沿って利用されている。これも今更変えられないし、そもそも【MS-DOS/Windows】とは別の世界で別のものに対して与えられた定義である。
  • MS-DOS/WindowsのファイルパスをURI形式で記述する手段は存在するが、そのように運用された場合の絶対パスは【URIとして見なした場合の絶対パス】と【MS-DOS/Windowsのファイルシステムとして考えたときの絶対パス】が異なる結果になる可能性がある。注意が必要である。

「最後の1つはよく分からないよ」

「たとえばさ。ホストマシンで仮想マシンを立ち上げたとき、どちらもアドレスが存在するが同じではない。仮想マシンの0番地はホストマシンでも0番地かどうかは分からない。そういうものだ」

「解釈によって同じメモリに与えられたアドレスが変化することがあるように、同じパスも解釈によって異なる結果を出しうるわけだね」

「そうだな。そもそも”c:test"形式だって、MS-DOS 1.Xの時代までは絶対パスと解釈可能だったんだ」

「ディレクトリを作成する機能が無い以上、そのファイルは必ずルートディレクトリにあると見なせたわけだね」

「まあ、その頃はルートディレクトリはおろかディレクトリという概念も無かったかが」

「ぎゃふん」

「まあ、表記なんてものは解釈次第でいくらでも変化しうると思った方がいい」

「でも、変化されては困るよ」

「だから定義を与えてそれを使うんだよ」

「定義は多くの可能性の中の1つに過ぎないが、一度定義されたらそれをみんなで遵守するのが好ましいわけだね」

「その通りだ。まあその言葉を【公的機関の定義にみんな従うべき】と拡大解釈する標準馬鹿もいて、それはそれで迷惑だけどな」

「みんなが既に使っている定義を否定する行為は迷惑なんだね」

「しかし、この場合はMS-DOS/Windowsの定義もURIの定義も幅広く使われているからどちらも否定できない」

「注意して使うしかないわけだね」