TOP / CODING / APP / LINK / NOTE / MAIL

Windowsにおけるパスの規則

パスまわりの規準は怪しい。私が知らないだけかもしれないが、資料も集まらないし、 一貫した定義はどこに置いてあるのだろうか。 とりあえず、Path* APIやその他のMS製ルーチンでどのように判定されるかを調べてみた。

注意。これらの関数はどれも/(スラッシュ)は区切り文字だと認識しない。

PathIsUNC

先頭の2文字が\かどうかのみで判断しているようだ。長さが2文字未満だとFALSE。 よって、\\\などでもTRUEになる。

PathIsUNCServer

これも\\でTRUEになる。 けどこちらはその後に1つでも\が表れるかどうかも判断しているみたい。なので\\\はFALSE。 それ以外に条件はないようなので、どんな文字が含まれていても(\\C:とかでも)OK。 そして\\?\はアウト。

PathIsUNCServerShare

\\に続く文字の中に\が1つだけ表れればTRUEになる。なので\\hoge\はもちろんのこと\\\もTRUE。 \\\hoge\や\\\\などはFALSE。

PathIsURL

3文字目以降にはじめて:が表れるかどうかを判断しているみたい。よって例えば 00: がTRUEになる。 また、:の前に使ってよい文字もチェックしているようだ。- や . はOKらしい。

PathIsRoot

絶対指定(2文字目:、3文字目\)か、 カレントドライブからの相対指定(1文字目\)だとTRUEになる。 その後に1文字でも付いてはダメ。 なので、親ディレクトリ指定をつかって実質的にはルートディレクトリを指していても (例えば C:\example\..\)これはFALSE。

PathIsRelative

\で始まるとFALSE。2文字目が:だとFALSE。それ以外はTRUE。なのでA::$DATAこんなのもFALSEになる。 どうも私の考えている絶対パスの定義どおりではないらしい。

PathIsNetworkPath

\\で始まるとTRUE。 また、MSDNには「2文字目が:だとTRUE」「実際にリソースが存在するかどうかは確認しない」とあるが、 2文字目が:であるだけではダメ。 指定したドライブが実際にネットワーク割り当てしたドライブとして存在していないとTRUEにならない。 つまり、ドライブをチェックしてる。ファイルを読みには行かない、という意味か?

ATL::IsFullPath

\\で始まるとTRUE、2文字目が:だとTRUE、あとはFALSE。 先頭に"があると飛ばして前文のルールを適用。うーむ。

...now surveying...


to the Top of this page