_tsplitpath_s(分解路径) _tmakepath_s(创建路径)
2014-08-13 23:28
363 查看
函数原型:
函数原型:errno_t _splitpath_s(
const char * path,
char * drive,
size_t driveNumberOfElements,
char * dir,
size_t dirNumberOfElements,
char * fname,
size_t nameNumberOfElements,
char * ext,
size_t extNumberOfElements
);
errno_t _wsplitpath_s(
const wchar_t * path,
wchar_t * drive,
size_t driveNumberOfElements,
wchar_t *dir,
size_t dirNumberOfElements,
wchar_t * fname,
size_t nameNumberOfElements,
wchar_t * ext,
size_t extNumberOfElements
);
参数:
[in] path
全路径
[out] drive
驱动器号,后跟一个冒号(:),如果你不需要驱动器号,可以传递NULL
[in] driveNumberOfElements
Drive的缓冲区大小(单字节或款字节),如果drive为NULL,该参数必须为0
[out] dir
目录路径,包括尾部的斜杠,可以使用“\”,“/”或者都使用,如果不需要目录路径,可以传递NULL
[in] dirNumberOfElements
Dir的缓冲区大小(单字节或者款字节),如果dir为NULL,该参数必须为0
[out] fname
不带扩展名的文件名,如果不需要文件名,可以传递NULL
[in] nameNumberOfElements
Fname的缓冲区大小(单字节或者宽字节),如果fname为NULL,该参数必须为0
[out] ext
文件的扩展名,包括“.”,如果不需要扩展名,可以传递NULL
[in] extNumberOfElements
Ext的缓冲区大小(单字节或者宽字节),如果ext为NULL,该参数必须为0
返回值:
成功返回0,失败返回错误代码 EINVAL
错误的情况有:
Condition | Return Value |
path is NULL | EINVAL |
drive is NULL, driveNumberOfElements is non-zero | EINVAL |
drive is non-NULL, driveNumberOfElements is zero | EINVAL |
dir is NULL, dirNumberOfElements is non-zero | EINVAL |
dir is non-NULL, dirNumberOfElements is zero | EINVAL |
fname is NULL, nameNumberOfElements is non-zero | EINVAL |
fname is non-NULL, nameNumberOfElements is zero | EINVAL |
ext is NULL, extNumberOfElements is non-zero | EINVAL |
ext is non-NULL, extNumberOfElements is zero | EINVAL |
任何一个指针指向空,那么对应的缓冲区必须为0,否者调用失败,返回EINVAL。
如果任何一个缓冲区太短而无法包含结果,那么该函数会清空所有缓冲区指向空。设置errno 为ERANGE,并返回ERANGE。
注意:
_splitpath_s 该函数将全路径分割成四个部分,分别是驱动器,路径名,文件名(不带扩展名),扩展名。_splitpath_s会根据当前正在使用的多字节页码来识别多字节字符来处理宽字节字符串。_wsplitpath_s是_splitpath_s的多字节版本,_wsplitpath_s的参数是宽字符。
全路径被分成四个部分分别存储在不同的缓冲区中,每个部分允许的最大值为_MAX_DRIVE, _MAX_DIR,_MAX_FNAME, and_MAX_EXT,这些宏定义在stdlib.h中,如果这四个部分的缓冲区大小超过了定义的允许的最大值,那么会引起heap corruption.
以下是四个宏的定义的最大值:
Name | Value |
_MAX_DRIVE | 3 |
_MAX_DIR | 256 |
_MAX_FNAME | 256 |
_Max_EXT | 256 |
如果全路径中缺少一个部分(例如没有文件名)_splitpath_s会为对应的缓冲区赋值为空。
头文件:
Routine | Required haerd |
_splitpath_s | <stdlib.h> |
_wsplitpath_s | <stdlib.h> or <wchar.h> |
// tchar.h 中的宏定义
#define _tsplitpath _splitpath#define _tsplitpath_s _splitpath_s
代码例子:
void MXSPLITPATH_S(const TCHAR* szFullPath, TCHAR* szDrive, TCHAR* szDir, TCHAR* szFileName, TCHAR* szExt)
{
#if (_MSC_VER > 1310) // VS2005
_splitpath_s(szFullPath, szDrive, szDrive ? _MAX_DRIVE : 0,
szDir, szDir ? _MAX_DIR : 0, szFileName,
szFileName ? _MAX_FNAME : 0, szExt, szExt ? _MAX_EXT : 0);
#else
_splitpath(szFullPath, szDrive, szDir, szFileName, szExt);
#endif
}
_makepath_s、_wmakepath_s
从组件创建路径名。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
包含实际文件扩展名,带或不带前导的句点 (.)。 如果不出现在 ext,_makepath_s 会自动插入时间。 如果 ext 是NULL 或指向空字符串,则在复合 path 字符串中不插入扩展。
返回值
如果成功,则为零;如果失败,则为错误代码。
错误情况
path | sizeInWords / sizeInBytes | 返回 | path 的内容 |
---|---|---|---|
NULL | any | EINVAL | 未修改 |
any | <= 0 | EINVAL | 未修改 |
备注
_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 |
如果路径是 NULL,则将调用无效参数处理程序,如参数验证所述。 此外,将errno 设置为 EINVAL。 NULL 值允许所有其他参数。
在 C++ 中,使用这些函数由模板重载简化;重载可以自动推导出缓冲区长度 (不再需要指定大小参数),并且它们可以自动用以更新、更安全的对应物替换旧的、不安全的函数。 有关更多信息,请参见安全模板重载。
这些函数的调试版本首先用 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
相关文章推荐
- 用_makepath和_splitpath构造路径&分解路径
- .net中创建目录的问题(未找到路径X的一部分|Could not find a part of the path)
- _splitpath,_makepath分析路径
- _splitpath,_makepath分析路径
- ftpClient.makeDirectory(path) 一直返回false,无法创建目录的问题
- 路径获取包括后缀名makepath
- _splitpath,_makepath分析路径
- 获得文件路径 _pgmptr, _makepath, _splitpath
- _makepath and _splitpath 分析路径
- _splitpath,_makepath分析路径
- _splitpath,_makepath分析路径
- _splitpath,_makepath分析路径
- VC++ MFC 创建多级目录的方法 MakeSureDirectoryPathExists (另附 文件、目录操作类)
- _splitpath,_makepath分析路径
- Struts2关于Action的系统训练3关于Action创建和path路径问题
- 使用MakeSureDirectoryPathExists 创建多级目录
- Discuz!图片附件获取缩略图路径makethumbpath以及生成缩略图方法
- _splitpath / _wsplitpath 将绝对路径分割为盘符、路径、文件名、扩展名。
- 使用ShLwApi中的PathCompactPathEx进行路径压缩显示
- JavaEE路径陷阱之getRealPath