_makepath_s、_wmakepath_s
更新 : 2007 年 11 月
パス名の要素からパス名を作成します。これらの関数は、「CRT のセキュリティ強化」に説明されているように、_makepath、_wmakepath のセキュリティが強化されたバージョンです。
errno_t _makepath_s(
char *path,
size_t sizeInWords,
const char *drive,
const char *dir,
const char *fname,
const char *ext
);
errno_t _wmakepath_s(
wchar_t *path,
size_t sizeInBytes,
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
ドライブ名。[入力] dir
ディレクトリ パス。[入力] fname
ファイル名。[入力] ext
ファイル名の拡張子。
戻り値
正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。
エラー条件
path |
sizeInWords / sizeInBytes |
Return |
path の内容 |
---|---|---|---|
NULL |
any |
EINVAL |
変更されない |
any |
<= 0 |
EINVAL |
変更されない |
上記のいずれかのエラー条件が発生すると、これらの関数は「パラメータの検証」に説明されているように、無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、errno が EINVAL に設定され、この関数は EINVAL を返します。NULL は、drive、fname、ext の各パラメータで使用できます。これらのパラメータが null ポインタまたは空の文字列である場合の動作については、「解説」を参照してください。
解説
_makepath_s 関数は、1 つのパスを作成し、path に格納します。パスには、ドライブ名、ディレクトリのパス、ファイル名、およびファイル名の拡張子が含まれます。ワイド文字を扱う場合は、_makepath_s ではなく _wmakepath_s を使用します。この場合、_wmakepath_s の引数にはワイド文字列を指定します。引数の指定以外では、_wmakepath_s と _makepath_s の動作は同じです。
汎用テキスト ルーチンのマップ
Tchar.h のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tmakepath_s |
_makepath_s |
_makepath_s |
_wmakepath_s |
パスの要素を含むバッファを指す引数は次のとおりです。
drive
目的のドライブに対応する文字 (A、B など) を指定します。後続のコロンは省略できます。コロンを省略した場合、_makepath_s によって、コロンが自動的にパス名に挿入されます。drive が null 文字または空の文字列の場合、作成される path 文字列にドライブ名とコロンは含まれません。dir
ドライブ指定子と実際のファイル名を除いて、ディレクトリのパスを指定します。後続のスラッシュまたは円記号は省略できます。1 つの dir 引数には、スラッシュ (/) か円記号 (\)、またはその両方を使用することもできます。後続のスラッシュ (/) または円記号 (\) は、指定しなくても自動的に挿入されます。dir が null 文字または空の文字列の場合、作成される path 文字列にスラッシュや円記号は挿入されません。fname
拡張子を付けずにベース ファイル名を指定します。fname が NULL の場合、または空の文字列を指す場合、作成される path 文字列にファイル名は挿入されません。ext
実際のファイル名の拡張子を指定します。先頭のピリオド (.) は省略できます。ext にピリオドがない場合、_makepath_s によって自動的にピリオドが挿入されます。ext が null 文字または空の文字列の場合、作成される path 文字列にピリオドは挿入されません。
path 引数は、絶対パスを保持するのに十分な大きさの空きバッファを指す必要があります。path を構成するフィールドにサイズ制限はありませんが、作成される path の長さは、Stdlib.h に定義されている _MAX_PATH 定数以下にする必要があります。_MAX_PATH 定数は、現在のオペレーティング システムで処理できる長さを超えることがあります。
C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファ長を自動的に推論できる (サイズの引数を指定する必要がなくなる) だけでなく、古くてセキュリティが万全ではない関数を新しく安全な関数に自動的に置き換えることができます。詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
これらの関数のデバッグ バージョンは、最初にバッファを 0xFD で埋めます。この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_makepath_s |
<stdlib.h> |
_wmakepath_s |
<stdlib.h> または <wchar.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// 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