Share via


_makepath_s, _wmakepath_s

创建从元素的路径名称。 这些是 _makepath, _wmakepath 的版本与安全增强的 CRT中的安全功能如中所述。

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

参数

  • [out] path
    完整路径缓冲区。

  • [in] sizeInWords
    缓冲区的大小在运行的。

  • [in] sizeInBytes
    缓冲区的大小 (以字节为单位)。

  • [in] drive
    包含一个字母 (A, B,等) 与所需的驱动程序和可选尾部的冒号对应。 _makepath_s 插入自动冒号在聚合路径,则会丢失。 如果 drive 是 NULL 或指向一个空字符串,驱动器号不会出现在复合 path 字符串。

  • [in] dir
    包含目录路径,不包括驱动器指示符或实际文件名。 这尾部斜杠是可选的,因此,一个正斜杠 (/) 或斜杠 (\) 或两个可用于唯一 dir 参数。 如果尾部的反斜杠 (/或 \) 未指定,则自动插入。 如果 dir 是 NULL 或指向一个空字符串,目录路径在聚合 path 字符串中插入。

  • [in] fname
    包含基文件名,没有任何文件扩展名。 如果 fname 是 NULL 或指向一个空字符串,文件名在聚合 path 字符串中插入。

  • [in] ext
    包含实际文件扩展名,有或没有驱动的句点 ()。 _makepath_s 插入自动内,如果不出现在 ext。 如果 ext 是 NULL 或指向一个空字符串,扩展在聚合 path 字符串中插入。

返回值

零,如果成功;在失败的错误代码。

错误状态

path

sizeInWords / sizeInBytes

Return

path内容

NULL

任何

EINVAL

不修改

任何

AMP_LT= 0

EINVAL

不修改

如果任何一个上述错误状态,当调用这些功能无效参数处理程序,如 参数验证所述。 如果执行允许继续, errno 设置为EINVAL ,并且函数返回EINVAL**.** NULL 允许参数 drive、 fname和 ext。 有关该行为的信息,当这些参数为 null 指针或空字符串时,请参见 " 备注 " 节。

备注

_makepath_s 功能创建从各个元素的复合路径字符串,将结果存储在 path。 path 可能包括驱动器号、目录路径、文件名和文件扩展名。 _wmakepath_s_makepath_s的宽字符版本;为 _wmakepath_s 的参数是宽字符字符串。 _wmakepath_s_makepath_s 否则具有相同的行为。

一般文本例程映射

Tchar.h 实例

未定义的 _UNICODE 和 _MBCS

定义的 _MBCS

定义的 _UNICODE

_tmakepath_s

_makepath_s

_makepath_s

_wmakepath_s

path 参数必须指向足够大空缓冲区容纳完整路径。 复合 path 大于 _MAX_PATH 串常数必须不,定义在 Stdlib.h。

如果该路径是 NULL,无效参数调用处理程序,如 参数验证所述。 此外, errno 设置为 EINVAL。 NULL 值允许其他参数。

在 C++ 中,使用这些功能由模板重载简化;重载可推断缓冲区长度 (自动不再需要指定范围参数),并且还可以用以较新,安全重复自动替换旧,不安全的功能。 有关更多信息,请参见 安全模板重载

这些函数的 " debug " 版本用 0xFD 首先加载缓冲区。 若要禁用此行为,请使用 _CrtSetDebugFillThreshold

要求

实例

必需的头

_makepath_s

stdlib.h

_wmakepath_s

stdlib.h 或 wchar.h

有关更多兼容性信息,请参见中介绍的 兼容性

示例

// 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 );
}

Output

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

.NET Framework 等效项

系统:: IO:: 文件:: 创建

请参见

参考

文件处理

_fullpath, _wfullpath

_splitpath_s, _wsplitpath_s

_makepath, _wmakepath