题
如何从C中的路径名中提取基本路径?
C语言或C运行时库中是否有任何函数可以从C中的路径名中提取基本路径?
我问基本上与this问题相反.
注意:我更喜欢跨平台解决方案,但我在Windows中工作,所以如果有一个Windows API调用这样做,我仍然想知道.
例子
- Input | Output
- ---------------------------------
- C:\path\to\file -> C:\path\to\
- C:\path\to\file.c -> C:\path\to\
- C:\file -> C:\
- .\file -> .\
- .\ -> .\
- \ -> \
参考
解决方法
在Windows上有
_splitpath.
例
- #include <Windows.h>
- #include <tchar.h>
- // Use your own error codes here
- #define SUCCESS 0L
- #define FAILURE_NULL_ARGUMENT 1L
- #define FAILURE_API_CALL 2L
- #define FAILURE_INSUFFICIENT_BUFFER 3L
- DWORD GetBasePathFromPathName( LPCTSTR szPathName,LPTSTR szBasePath,DWORD dwBasePathSize )
- {
- TCHAR szDrive[_MAX_DRIVE] = { 0 };
- TCHAR szDir[_MAX_DIR] = { 0 };
- TCHAR szFname[_MAX_FNAME] = { 0 };
- TCHAR szExt[_MAX_EXT] = { 0 };
- size_t PathLength;
- DWORD dwReturnCode;
- // Parameter validation
- if( szPathName == NULL || szBasePath == NULL )
- {
- return FAILURE_NULL_ARGUMENT;
- }
- // Split the path into it's components
- dwReturnCode = _tsplitpath_s( szPathName,szDrive,_MAX_DRIVE,szDir,_MAX_DIR,szFname,_MAX_FNAME,szExt,_MAX_EXT );
- if( dwReturnCode != 0 )
- {
- _ftprintf( stderr,TEXT("Error splitting path. _tsplitpath_s returned %d.\n"),dwReturnCode );
- return FAILURE_API_CALL;
- }
- // Check that the provided buffer is large enough to store the results and a terminal null character
- PathLength = _tcslen( szDrive ) + _tcslen( szDir );
- if( ( PathLength + sizeof( TCHAR ) ) > dwBasePathSize )
- {
- _ftprintf( stderr,TEXT("Insufficient buffer. required %d. Provided: %d\n"),PathLength,dwBasePathSize );
- return FAILURE_INSUFFICIENT_BUFFER;
- }
- // Copy the szDrive and szDir into the provide buffer to form the basepath
- if( ( dwReturnCode = _tcscpy_s( szBasePath,dwBasePathSize,szDrive ) ) != 0 )
- {
- _ftprintf( stderr,TEXT("Error copying string. _tcscpy_s returned %d\n"),dwReturnCode );
- return FAILURE_API_CALL;
- }
- if( ( dwReturnCode = _tcscat_s( szBasePath,szDir ) ) != 0 )
- {
- _ftprintf( stderr,TEXT("Error copying string. _tcscat_s returned %d\n"),dwReturnCode );
- return FAILURE_API_CALL;
- }
- return SUCCESS;
- }