_makepath_s, _wmakepath_s

コンポーネントからパス名を作成します。 これらの関数は、CRT_makepath_wmakepathセキュリティ機能の説明に従ってセキュリティが強化されたバージョンの関数です。

構文

errno_t _makepath_s(
   char *path,
   size_t sizeInBytes,
   const char *drive,
   const char *dir,
   const char *fname,
   const char *ext
);
errno_t _wmakepath_s(
   wchar_t *path,
   size_t sizeInWords,
   const wchar_t *drive,
   const wchar_t *dir,
   const wchar_t *fname,
   const wchar_t *ext
);
template <size_t size>
errno_t _makepath_s(
   char (&path)[size],
   const char *drive,
   const char *dir,
   const char *fname,
   const char *ext
); // C++ only
template <size_t size>
errno_t _wmakepath_s(
   wchar_t (&path)[size],
   const wchar_t *drive,
   const wchar_t *dir,
   const wchar_t *fname,
   const wchar_t *ext
); // C++ only

パラメーター

path
完全なパスのバッファー。

sizeInWords
バッファーのサイズ (単語単位)。

sizeInBytes
バッファーのサイズ (バイト単位)。

drive
必要なドライブに対応する文字 (A、B など) と、この後に続くオプションのコロンを含んでいます。 _makepath_s が指定されていない場合は、複合パスにコロンが自動的に挿入されます。 driveNULL であるか空の文字列へのポインターである場合、合成される path 文字列にドライブ文字は含まれません。

dir
ドライブ指定子も実際のファイル名も含まない、ディレクトリのパスを含んでいます。 末尾のスラッシュは省略可能で、スラッシュ (/) または円記号 (\) または両方を 1 つの dir 引数で使用できます。 末尾のスラッシュ (/ または \) が指定されていない場合は、自動的に挿入されます。 dirNULL であるか空の文字列へのポインターである場合、合成された path 文字列にディレクトリ パスは挿入されません。

fname
ファイル名拡張子がないベース ファイル名が含まれています。 fnameNULL であるか空の文字列へのポインターである場合、合成された path 文字列にファイル名は挿入されません。

ext
実際のファイル名拡張子が含まれており、先頭のピリオド (.) の有無は問いません。 _makepath_s に表示されない場合は、ピリオドが自動的に ext挿入されます。 extNULL であるか空の文字列へのポインターである場合、合成された path 文字列に拡張子は挿入されません。

戻り値

正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。

エラー条件

path sizeInWords / sizeInBytes Return path の内容
NULL any EINVAL 変更されない
any <= 0 EINVAL 変更されない

上記のいずれかのエラー状態が発生した場合、「パラメーターの検証」で説明されているように、これらの関数は無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、errnoEINVAL に設定され、関数から EINVAL が返されます。 NULL は、drivefnameext の各パラメーターで許可されています。 これらのパラメーターが Null ポインターまたは空の文字列である場合の動作の詳細については、「コメント」セクションを参照してください。

解説

_makepath_s 関数は個別のコンポーネントから合成パス文字列を作成し、path に結果を格納します。 path に格納される可能性があるのは、ドライブ文字、ディレクトリ パス、ファイル名、ファイル名拡張子です。 _wmakepath_s_makepath_sのワイド文字バージョンであり、 _wmakepath_s の引数はワイド文字列です。 それ以外では、_wmakepath_s_makepath_s の動作は同じです。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

汎用テキスト ルーチンのマップ

Tchar.h のルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tmakepath_s _makepath_s _makepath_s _wmakepath_s

path 引数は、完全なパスを保持するのに十分な大きさの空のバッファーを指す必要があります。 合成 path は、Stdlib.h で定義されている、_MAX_PATH 定数以下にする必要があります。

パスが指定されている場合、「NULLパラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 さらに、errnoEINVAL に設定されます。 その他のすべてのパラメーターに対しては NULL 値が許可されます。

C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファー長を自動的に推論できる (サイズの引数を指定する必要がなくなる) だけでなく、古くてセキュリティが万全ではない関数を新しく安全な関数に自動的に置き換えることができます。 詳細については、「セキュリティで保護されたテンプレート オーバーロード」を参照してください

これらの関数のデバッグ ライブラリ バージョンでは、最初にバッファーを 0xFE で埋めます。 この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。

必要条件

ルーチンによって返される値 必須ヘッダー
_makepath_s <stdlib.h>
_wmakepath_s <stdlib.h> または <wchar.h>

互換性の詳細については、「 Compatibility」を参照してください。

// crt_makepath_s.c

#include <stdlib.h>
#include <stdio.h>

int main( void )
{
   char path_buffer[_MAX_PATH];
   char drive[_MAX_DRIVE];
   char dir[_MAX_DIR];
   char fname[_MAX_FNAME];
   char ext[_MAX_EXT];
   errno_t err;

   err = _makepath_s( path_buffer, _MAX_PATH, "c", "\\sample\\crt\\",
                      "crt_makepath_s", "c" );
   if (err != 0)
   {
      printf("Error creating path. Error code %d.\n", err);
      exit(1);
   }
   printf( "Path created with _makepath_s: %s\n\n", path_buffer );
   err = _splitpath_s( path_buffer, drive, _MAX_DRIVE, dir, _MAX_DIR, fname,
                       _MAX_FNAME, ext, _MAX_EXT );
   if (err != 0)
   {
      printf("Error splitting the path. Error code %d.\n", err);
      exit(1);
   }
   printf( "Path extracted with _splitpath_s:\n" );
   printf( "   Drive: %s\n", drive );
   printf( "   Dir: %s\n", dir );
   printf( "   Filename: %s\n", fname );
   printf( "   Ext: %s\n", ext );
}
Path created with _makepath_s: c:\sample\crt\crt_makepath_s.c

Path extracted with _splitpath_s:
   Drive: c:
   Dir: \sample\crt\
   Filename: crt_makepath_s
   Ext: .c

関連項目

ファイル処理
_fullpath, _wfullpath
_splitpath_s, _wsplitpath_s
_makepath, _wmakepath