Windowsの絶対パスと言えば、C:\Windowsのようなドライブ文字で始まる表記を思い浮かべることと思います。しかし、ドライブ(ボリューム)を指定する表記はほかにもあります。

ボリュームGUID
各ボリュームに対するGUIDです。mountvolコマンドで確認できます。
ディスク番号・パーティション番号による表記
正式な名称は分かりませんが、Harddisk0Partition1のような文字列です。それぞれの番号は、diskpartコマンドやWMIなどで確認できるはずです。CDドライブなどでは、CdRom0などとなるようです。

いずれも、SysinternalsのWinObjで確認すると、C:などのドライブ文字と同じ\GLOBAL??名前空間に存在しています。つまり、C:などのドライブ文字と取っ替えて使えるはずと予想するわけです。実際、次のプログラム、3種類のどのパスの表記でも同じように動きます。

#define UNICODE
#define _UNICODE
 
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
 
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表記がなされている事例を見かけて、この存在を知りました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ ドライブ文字を使わないパス指定
  • ⇒ ドライブ文字を使わないパス指定