將一個路徑名稱分割為多個元件。 這些函式是 _splitpath, _wsplitpath 的版本,具有 CRT 中的安全性功能中所述的安全性增強功能。
語法
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
);
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _splitpath_s(
const char *path,
char (&drive)[drivesize],
char (&dir)[dirsize],
char (&fname)[fnamesize],
char (&ext)[extsize]
); // C++ only
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _wsplitpath_s(
const wchar_t *path,
wchar_t (&drive)[drivesize],
wchar_t (&dir)[dirsize],
wchar_t (&fname)[fnamesize],
wchar_t (&ext)[extsize]
); // C++ only
參數
path
完整路徑。
drive
後接冒號 (:) 的磁碟機代號。 如果您不需要驅動器號,可以傳遞 NULL 此參數。
driveNumberOfElements
以單一位元組或寬字元表示的 drive 緩衝區大小。 如果 drive 為 NULL,則這個值必須是 0。
dir
目錄路徑,包括結尾斜線。 可以使用正斜線 (/) 和 (或) 反斜線 (\\)。 如果您不需要目錄路徑,則可以傳遞 NULL 此參數。
dirNumberOfElements
以單一位元組或寬字元表示的 dir 緩衝區大小。 如果 dir 為 NULL,則這個值必須是 0。
fname
基底檔名 (不含副檔名)。 如果您不需要檔名,可以傳遞 NULL 此參數。
nameNumberOfElements
以單一位元組或寬字元表示的 fname 緩衝區大小。 如果 fname 為 NULL,則這個值必須是 0。
ext
副檔名,包括前置句點 (.)。 如果您不需要擴展名,可以傳遞 NULL 此參數。
extNumberOfElements
以單一位元組或寬字元表示的 ext 緩衝區大小。 如果 ext 為 NULL,則這個值必須是 0。
傳回值
如果成功,就是零,如果失敗,則為錯誤碼。
錯誤條件
| Condition | 傳回值 |
|---|---|
path 是 NULL |
EINVAL |
drive 為 NULL,而 driveNumberOfElements 為非零 |
EINVAL |
drive 為非 NULL,而 driveNumberOfElements 為零 |
EINVAL |
dir 為 NULL,而 dirNumberOfElements 為非零 |
EINVAL |
dir 為非 NULL,而 dirNumberOfElements 為零 |
EINVAL |
fname 為 NULL,而 nameNumberOfElements 為非零 |
EINVAL |
fname 為非 NULL,而 nameNumberOfElements 為零 |
EINVAL |
ext 為 NULL,而 extNumberOfElements 為非零 |
EINVAL |
ext 為非 NULL,而 extNumberOfElements 為零 |
EINVAL |
如果發生上述任一情況,則會叫用無效的參數處理程式,如參數驗證中所述。 如果允許繼續執行,這些函式會將 errno 設為 EINVAL,並傳回 EINVAL。
如果有任何緩衝區太短而無法保留結果,這些函式會將所有緩衝區清除成空字串、將 errno 設定為 ERANGE,並傳回 ERANGE。
備註
_splitpath_s 函式會將一個路徑分割為它的四個元件。 _splitpath_s 會根據目前使用中的多位元組字碼頁,自動將多位元組字元字串引數處理為適當且可辨識的多位元組字元序列。 _wsplitpath_s 是 _splitpath_s的寬字元版本; _wsplitpath_s 的引數是寬字元字串。 否則,這些函式的行為相同。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
TCHAR.H 常式 |
_UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
|---|---|---|---|
_tsplitpath_s |
_splitpath_s |
_splitpath_s |
_wsplitpath_s |
完整路徑的每個元件都會儲存在個別的緩衝區中;指令清單常數_MAX_DRIVE、 _MAX_DIR和 _MAX_FNAME_MAX_EXT (定義於 STDLIB.H中) 會指定每個檔案元件允許的大小上限。 大於對應資訊清單常數的檔案元件會造成堆積損毀。
下表列出資訊清單常數的值。
| 名稱 | 值 |
|---|---|
_MAX_DRIVE |
3 |
_MAX_DIR |
256 |
_MAX_FNAME |
256 |
_MAX_EXT |
256 |
如果完整路徑不包含元件(例如檔名), _splitpath_s 請將空字串指派給對應的緩衝區。
在 C++ 中,使用這些函式已透過範本多載簡化;多載可自動推斷緩衝區長度,因而不需要指定大小引數。 如需詳細資訊,請參閱安全範本多載。
這些函式的偵錯連結庫版本會先將緩衝區填入0xFE。 若要停用此行為,請使用 _CrtSetDebugFillThreshold。
需求
| 常式 | 必要的標頭 |
|---|---|
_splitpath_s |
<stdlib.h> |
_wsplitpath_s |
<stdlib.h> 或 <wchar.h> |
如需相容性詳細資訊,請參閱相容性。
範例
請參閱、 的_makepath_s_wmakepath_s範例。
另請參閱
檔案處理
_splitpath, _wsplitpath
_fullpath, _wfullpath
_getmbcp
_makepath, _wmakepath
_setmbcp