GetFullPathNameW 関数 (fileapi.h)
指定したファイルの完全なパスとファイル名を取得します。
この操作をトランザクション操作として実行するには、 GetFullPathNameTransacted 関数を 使用します。
ファイル名とパス名の詳細については、「 ファイル名、パス、および名前空間」を参照してください。
構文
DWORD GetFullPathNameW(
[in] LPCWSTR lpFileName,
[in] DWORD nBufferLength,
[out] LPWSTR lpBuffer,
[out] LPWSTR *lpFilePart
);
パラメーター
[in] lpFileName
ファイルの名前です。
このパラメーターには、短い (8.3 形式) または長いファイル名を指定できます。 この文字列には、共有名またはボリューム名を指定することもできます。
既定では、名前はMAX_PATH文字に制限されています。 この制限を 32,767 文字のワイド文字に拡張するには、パスの先頭に "\\?\" を付加します。 詳細については、「ファイル、パス、および名前空間の名前付け」を参照してください。
ヒント
Windows 10 バージョン 1607 以降では、"\\?\" を前に置かずに、MAX_PATHの制限を削除するようにオプトインできます。 詳細については、「 ファイル、パス、および名前空間の名前付け 」の「最大パス長の制限」セクションを参照してください。
[in] nBufferLength
ドライブとパスの null で終わる文字列を受信するバッファーのサイズ (TCHAR)。
[out] lpBuffer
ドライブとパスの null で終わる文字列を受け取るバッファーへのポインター。
[out] lpFilePart
パス内の最終的なファイル名コンポーネントのアドレス ( lpBuffer 内) を受け取るバッファーへのポインター。
このパラメーターは、NULL でもかまいません。
lpBuffer がファイルではなくディレクトリを参照している場合、lpFilePart は 0 を受け取ります。
戻り値
関数が成功した場合、戻り値は lpBuffer にコピーされた文字列の TCHAR の長さであり、終端の null 文字は含まれません。
lpBuffer バッファーが小さすぎてパスを格納できない場合、戻り値は、パスと終端の null 文字を保持するために必要なバッファーのサイズ (TCHAR) です。
関数が他の理由で失敗した場合、戻り値は 0 になります。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
GetFullPathName は、現在のドライブとディレクトリの名前を指定したファイル名とマージして、指定したファイルの完全なパスとファイル名を決定します。 また、完全パスとファイル名のファイル名部分のアドレスも計算されます。
この関数は、結果のパスとファイル名が有効であること、または関連付けられているボリューム上に既存のファイルが表示されることを確認しません。
lpFilePart パラメーターには文字列バッファー領域は必要ありませんが、1 つのアドレスに対してのみ十分であることに注意してください。 これは、 lpBuffer に既に存在するバッファー内のアドレスを単に返すからです。
共有名とボリューム名は、 lpFileName に対して有効な入力です。 たとえば、test-2 がリモート コンピューターで、U: が現在のディレクトリがボリュームのルートであるネットワーク マップドライブの場合、次のリストは返されるパスとファイル名を識別します。
- "\\test-2\q$\lh" を指定した場合、返されるパスは "\\test-2\q$\lh" です
- "\\?\UNC\test-2\q$\lh" を指定した場合、返されるパスは "\\?\UNC\test-2\q$\lh" です
- "U:" を指定した場合、返されるパスは "U:\" の現在のディレクトリですドライブ
戻り値が nBufferLength で指定された値以上の場合は、パスを保持するのに十分な大きさのバッファーを使用して関数を再度呼び出すことができます。 この場合の例は、動的割り当てに長さ 0 のバッファーを使用するだけでなく、コード例に関するセクションを参照してください。
GetFullPathName 関数に渡される相対パスは、プロセスの現在のディレクトリに対する相対パスとして解釈されます。 SetCurrentDirectory 関数によって書き込まれた現在のディレクトリの状態は、プロセスに対してグローバルであり、いつでも任意のスレッドで変更できます。 相対パスを使用して GetFullPathName 関数を連続して呼び出すと、現在のディレクトリが 2 つの呼び出しの間で変更された場合、異なる結果が生成される可能性があることに注意する必要があります。
一貫性のない結果が原因で発生する問題を回避するには、マルチスレッド アプリケーションと共有ライブラリ コードで相対パスを使用しないようにする必要があります。 相対パスを受け取る場合は、相対パスを CreateFile などの関数に直接渡すか、絶対パスに変換し、そのポイントの絶対パスを使用して、1 回だけ使用する必要があります。
Windows 8とWindows Server 2012では、この関数は次のテクノロジでサポートされています。
テクノロジ | サポートされています |
---|---|
サーバー メッセージ ブロック (SMB) 3.0 プロトコル | はい |
SMB 3.0 Transparent Failover (TFO) | はい |
SMB 3.0 とスケールアウト ファイル共有 (SO) | はい |
クラスター共有ボリューム ファイル システム (CsvFS) | はい |
Resilient File System (ReFS) | はい |
例
次の C++ の例は、GetFullPathName、GetLongPathName、および GetShortPathName の基本的な使用方法を示しています。 動的割り当てを使用する別の例については、「 GetShortPathName」を参照してください。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define BUFSIZE 4096
#define LONG_DIR_NAME TEXT("c:\\longdirectoryname")
void _tmain(int argc, TCHAR *argv[])
{
DWORD retval=0;
BOOL success;
TCHAR buffer[BUFSIZE]=TEXT("");
TCHAR buf[BUFSIZE]=TEXT("");
TCHAR** lppPart={NULL};
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [file]\n"), argv[0]);
return;
}
// Retrieve the full path name for a file.
// The file does not need to exist.
retval = GetFullPathName(argv[1],
BUFSIZE,
buffer,
lppPart);
if (retval == 0)
{
// Handle an error condition.
printf ("GetFullPathName failed (%d)\n", GetLastError());
return;
}
else
{
_tprintf(TEXT("The full path name is: %s\n"), buffer);
if (lppPart != NULL && *lppPart != 0)
{
_tprintf(TEXT("The final component in the path name is: %s\n"), *lppPart);
}
}
// Create a long directory name for use with the next two examples.
success = CreateDirectory(LONG_DIR_NAME,
NULL);
if (!success)
{
// Handle an error condition.
printf ("CreateDirectory failed (%d)\n", GetLastError());
return;
}
// Retrieve the short path name.
retval = GetShortPathName(LONG_DIR_NAME,
buf,
BUFSIZE);
if (retval == 0)
{
// Handle an error condition.
printf ("GetShortPathName failed (%d)\n", GetLastError());
return;
}
else _tprintf(TEXT("The short name for %s is %s\n"),
LONG_DIR_NAME, buf);
// Retrieve the long path name.
retval = GetLongPathName(buf,
buffer,
BUFSIZE);
if (retval == 0)
{
// Handle an error condition.
printf ("GetLongPathName failed (%d)\n", GetLastError());
return;
}
else _tprintf(TEXT("The long name for %s is %s\n"), buf, buffer);
// Clean up the directory.
success = RemoveDirectory(LONG_DIR_NAME);
if (!success)
{
// Handle an error condition.
printf ("RemoveDirectory failed (%d)\n", GetLastError());
return;
}
}
注意
fileapi.h ヘッダーは、GetFullPathName をエイリアスとして定義し、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 エンコードに依存しないエイリアスをエンコードニュートラルでないコードと組み合わせて使用すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。
要件
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | fileapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |