Windowsの絶対パスと言えば、C:\Windows
のようなドライブ文字で始まる表記を思い浮かべることと思います。しかし、ドライブ(ボリューム)を指定する表記はほかにもあります。
- ボリュームGUID
- 各ボリュームに対するGUIDです。mountvolコマンドで確認できます。
- ディスク番号・パーティション番号による表記
- 正式な名称は分かりませんが、
Harddisk0Partition1
のような文字列です。それぞれの番号は、diskpartコマンドやWMIなどで確認できるはずです。CDドライブなどでは、CdRom0
などとなるようです。
いずれも、SysinternalsのWinObjで確認すると、C:
などのドライブ文字と同じ\GLOBAL??
名前空間に存在しています。つまり、C:
などのドライブ文字と取っ替えて使えるはずと予想するわけです。実際、次のプログラム、3種類のどのパスの表記でも同じように動きます。
#define UNICODE
#define _UNICODE
#include
#include
#include
#include
int main()
{
#if 1
WCHAR path[] = LR"(\\?\Volume{e96621af-7084-11e3-80b0-XXXXXXXXXXXX}\Windows\system.ini)";
#elif 1
WCHAR path[] = LR"(\\?\Harddisk0Partition2\Windows\system.ini)";
#else
WCHAR path[] = LR"(C:\Windows\system.ini)";
#endif
std::ifstream ifs(path);
if (ifs)
{
std::cout << ifs.rdbuf() << std::endl;
}
}
すぐに思い浮かぶ用途は、ドライブ文字を割り当てていないボリューム(ドライブ)へのアクセスですね。というか、ドライブ文字を割り当てていないボリュームで、GUID表記がなされている事例を見かけて、この存在を知りました。
ドライブ文字を使わないパス指定 is a post from: イグトランスの頭の中