次の方法で共有


GetFullPathNameW 関数 (fileapi.h)

指定したファイルの完全なパスとファイル名を取得します。

この操作をトランザクション操作として実行するには、GetFullPathNameTransacted 関数を使用します。

ファイル名とパス名の詳細については、「ファイル名、パス、および名前空間のを参照してください。

マルチスレッド アプリケーションまたは共有ライブラリ コードでの GetFullPathName 関数での相対パスの使用については、「解説」セクションを参照してください。

構文

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 を受け取ります。

戻り値

関数が成功した場合、戻り値は、終端の null 文字を含まない、lpBufferにコピーされた文字列の長さ (TCHAR) です。

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:\" ドライブ上の現在のディレクトリです
getFullPathName は、指定されたファイル名を lpFileName変換しません。 指定したファイル名が存在する場合は、GetLongPathName または GetShortPathName を使用して、それぞれ長いパス名または短いパス名に変換できます。

戻り値が nBufferLengthで指定 値以上の場合は、パスを保持するのに十分な大きさのバッファーを使用して関数を再度呼び出すことができます。 動的割り当てに長さ 0 のバッファーを使用するだけでなく、この場合の例については、「コード例」セクションを参照してください。

注意 この場合の戻り値は終端の null 文字を含む長さですが、成功した場合の戻り値にはカウント内の終端の null 文字は含まれません。

GetFullPathName 関数に渡される相対パスは、プロセスの現在のディレクトリに対する相対パスとして解釈されます。 SetCurrentDirectory 関数によって書き込まれた現在のディレクトリの状態は、プロセスに対してグローバルであり、任意のスレッドでいつでも変更できます。 アプリケーションでは、GetFullPathName 関数を相対パスで連続して呼び出すと、2 つの呼び出しの間で現在のディレクトリが変更された場合に異なる結果が生成される可能性があることに注意する必要があります。

一貫性のない結果が原因で発生する問題を回避するには、マルチスレッド アプリケーションと共有ライブラリ コードで相対パスを使用しないようにする必要があります。 相対パスを受け取った場合は、相対パスを CreateFileなどの関数に直接渡すか、絶対パスに変換してそのポイントの絶対パスを使用して、1 回だけ使用する必要があります。

Windows 8 および Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジー サポート
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
SMB 3.0 とスケールアウト ファイル共有 (SO) はい
クラスター共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) はい
 

次の C++ の例は、GetFullPathNameGetLongPathName、および 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 ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetFullPathName を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー fileapi.h (Windows.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

ファイル管理機能の

GetFullPathNameTransacted の

GetLongPathName を する

GetShortPathName を する

GetTempPath を する

SearchPath