_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
が指定されていない場合は、複合パスにコロンが自動的に挿入されます。 drive
が NULL
であるか空の文字列へのポインターである場合、合成される path
文字列にドライブ文字は含まれません。
dir
ドライブ指定子も実際のファイル名も含まない、ディレクトリのパスを含んでいます。 末尾のスラッシュは省略可能で、スラッシュ (/) または円記号 (\) または両方を 1 つの dir
引数で使用できます。 末尾のスラッシュ (/ または \) が指定されていない場合は、自動的に挿入されます。 dir
が NULL
であるか空の文字列へのポインターである場合、合成された path
文字列にディレクトリ パスは挿入されません。
fname
ファイル名拡張子がないベース ファイル名が含まれています。 fname
が NULL
であるか空の文字列へのポインターである場合、合成された path
文字列にファイル名は挿入されません。
ext
実際のファイル名拡張子が含まれており、先頭のピリオド (.) の有無は問いません。 _makepath_s
は、ピリオドが ext
に表示されない場合は自動的に挿入します。 ext
が NULL
であるか空の文字列へのポインターである場合、合成された path
文字列に拡張子は挿入されません。
戻り値
正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。
エラー条件
path |
sizeInWords / sizeInBytes |
Return | path の内容 |
---|---|---|---|
NULL |
任意 | EINVAL |
変更されない |
任意 | <= 0 | EINVAL |
変更されない |
上記のいずれかのエラー状態が発生した場合、これらの関数は、 パラメーター検証で説明されているように、無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、errno
が EINVAL
に設定され、関数から EINVAL
が返されます。 NULL
は、drive
、fname
、ext
の各パラメーターで許可されています。 これらのパラメーターが 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
場合、「パラメーターの検証 で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 さらに、errno
が EINVAL
に設定されます。 その他のすべてのパラメーターに対しては 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