GetVolumePathNameW 関数 (fileapi.h)
指定したパスがマウントされているボリューム マウント ポイントを取得します。
構文
BOOL GetVolumePathNameW(
[in] LPCWSTR lpszFileName,
[out] LPWSTR lpszVolumePathName,
[in] DWORD cchBufferLength
);
パラメーター
[in] lpszFileName
入力パス文字列へのポインター。 このパスでは、絶対ファイル名と相対ファイル名とディレクトリ名 (".." など) の両方を使用できます。
ボリューム修飾子を指定せずに相対ディレクトリまたはファイル名を指定すると、 GetVolumePathName はブート ボリュームのドライブ文字を返します。
このパラメーターが空の文字列 "" の場合、関数は失敗しますが、最後のエラーは ERROR_SUCCESS に設定されます。
[out] lpszVolumePathName
入力パスのボリューム マウント ポイントを受け取る文字列へのポインター。
[in] cchBufferLength
出力バッファーの長さ (TCHAR)。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
指定したパスが渡された場合、 GetVolumePathName はボリューム マウント ポイントへのパスを返します。つまり、指定したパスのエンドポイントが配置されているボリュームのルートを返します。
たとえば、ボリューム D が にマウントされ、ボリューム E が にC:\Mnt\Ddrive
C:\Mnt\Ddrive\Mnt\Edrive
マウントされているとします。 また、パス E:\Dir\Subdir\MyFile
が のファイルがあるとします。 GetVolumePathName に渡C:\Mnt\Ddrive\Mnt\Edrive\Dir\Subdir\MyFile
すと、パス C:\Mnt\Ddrive\Mnt\Edrive\
が返されます。
相対ディレクトリまたはファイルがボリューム修飾子なしで渡された場合、関数はブート ボリュームのドライブ文字を返します。 無効なファイルまたはディレクトリ名が有効なボリューム修飾子なしで指定されている場合は、ブート ボリュームのドライブ文字も返されます。 有効なボリューム指定子が指定され、ボリュームが存在するが、無効なファイルまたはディレクトリ名が指定されている場合、関数は成功し、そのボリューム名が返されます。 例については、このトピックの「例」セクションを参照してください。
有効な Win32 名前空間パスを指定する必要があります。 NT 名前空間パス (例: または \Device\HardDiskVolume6
) を指定した場合、\DosDevices\H:
関数は、その NT 名前空間パスのドライブ文字ではなく、ブート ボリュームのドライブ文字を返します。
パス名と名前空間の詳細については、「 名前付けファイル、パス、および名前空間」を参照してください。
ローカル パスとリモート パスの両方を指定できます。 ローカル パスを指定した場合、 GetVolumePathName は、ボリュームを表す最も長いプレフィックスであるプレフィックスを持つ完全パスを返します。
ネットワーク共有が指定されている場合、 GetVolumePathName は 、GetDriveType が DRIVE_REMOTEを返す最短パスを返します。つまり、パスは存在するリモート ドライブとして検証され、現在のユーザーがアクセスできます。
末尾の円記号を返さない特殊なケースがあります。 これらは、出力バッファーの長さが 1 文字短すぎる場合に発生します。 たとえば、 lpszFileName が で C:
lpszVolumePathName が 4 文字の場合、返される値は C:\
です。ただし、 lpszVolumePathName が 3 文字の場合、返される値は になります C:
。 戻りバッファーのサイズを設定するより安全だが遅い方法は、 GetFullPathName 関数を呼び出し、バッファー サイズが GetFullPathName が返す完全パスと少なくとも同じサイズであることを確認することです。 出力バッファーが 2 文字以上短すぎると、関数は失敗し、エラーが返されます。
Windows 8 と Windows Server 2012 では、この関数は、次のテクノロジによってサポートされています。
テクノロジ | サポートされています |
---|---|
サーバー メッセージ ブロック (SMB) 3.0 プロトコル | いいえ |
SMB 3.0 Transparent Failover (TFO) | いいえ |
スケールアウト ファイル共有 (SO) を使う SMB 3.0 | いいえ |
クラスターの共有ボリューム ファイル システム (CsvFS) | はい |
Resilient File System (ReFS) | はい |
SMB では、ボリューム管理機能はサポートされていません。
末尾の Path 要素
無効な末尾のパス要素は無視されます。 リモート パスの場合、次のいずれかの条件に該当する場合、パス全体 (末尾の要素だけでなく) は無効と見なされます。
- パスが正しく形成されていません。
- パスが存在しません。
- 現在のユーザーはパスにアクセスできません。
ジャンクション ポイントとマウントされたフォルダー
指定したパスがジャンクション ポイントを通過する場合、 GetVolumePathName はジャンクション ポイントが参照するボリュームを返します。 たとえば、 が を指すジャンクション ポイントの場合W:\Adir
、 C:\Adir
でW:\Adir\Afile
呼び出された GetVolumePathName は を返しますC:\
。 指定したパスが複数のジャンクション ポイントを通過する場合、チェーン全体がフォローされ、 GetVolumePathName は、チェーン内の最後のジャンクション ポイントが参照するボリュームを返します。
マウントされたフォルダーまたはジャンクション ポイントへのリモート パスが指定されている場合、パスはリモート パスとして解析され、マウントされたフォルダーまたはジャンクション ポイントは無視されます。 たとえば、 がにリンクD:\Dir_D
され、C:
リモート コンピューターで にX:
マップされている場合C:\Dir_C
、GetVolumePathName を呼び出し、リモート コンピューターで を指定すると X:\Dir_C
が返されますX:\
。
例
次の一連の例では、U: はリモート コンピューター \\_YourComputer_\C$
にマップされ、Q はローカル ドライブです。
指定したパス | 関数は を返します |
---|---|
\\_YourComputer_\C$\Windows |
\\_YourComputer_\C$\ |
\\?\UNC\_YourComputer_\C$\Windows |
\\?\UNC\_YourComputer_\C$\ |
Q:\Windows |
Q:\ |
\\?\Q:\Windows |
\\?\Q:\ |
\\.\Q:\Windows |
\\.\Q:\ |
\\?\UNC\W:\Windows |
指定されたリモート パスが無効であるため、エラー 123 の FALSE。W$ 共有が存在しないか、ユーザー アクセス権が付与されていません。 |
C:\COM2 (存在する) |
\\.\COM2\ |
C:\COM3 (存在しない) |
存在しない COM デバイスが指定されているため、エラー 123 の FALSE。 |
次の一連の例では、パスに無効な末尾の path 要素が含まれています。
指定したパス | 関数は を返します |
---|---|
G:\invalid (無効なパス) |
G:\ |
\\.\I:\aaa\invalid (無効なパス) |
\\.\I:\ |
\\_YourComputer_\C$\invalid (末尾のパス要素が無効です) |
\\_YourComputer_\C$\ |
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | fileapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |