Share via


_splitpath_s, _wsplitpath_s

將一個路徑名稱分割為多個元件。 這些函式是 的版本 _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 緩衝區大小。 如果 driveNULL,則這個值必須是 0。

dir
目錄路徑,包括結尾斜線。 可以使用正斜線 (/) 和 (或) 反斜線 (\\)。 如果您不需要目錄路徑,則可以傳遞 NULL 此參數。

dirNumberOfElements
以單一位元組或寬字元表示的 dir 緩衝區大小。 如果 dirNULL,則這個值必須是 0。

fname
基底檔名 (不含副檔名)。 如果您不需要檔案名,可以傳遞 NULL 此參數。

nameNumberOfElements
以單一位元組或寬字元表示的 fname 緩衝區大小。 如果 fnameNULL,則這個值必須是 0。

ext
副檔名,包括前置句點 (.)。 如果您不需要副檔名,可以傳遞 NULL 此參數。

extNumberOfElements
以單一位元組或寬字元表示的 ext 緩衝區大小。 如果 extNULL,則這個值必須是 0。

傳回值

如果成功,就是零,如果失敗,則為錯誤碼。

錯誤條件

Condition 傳回值
pathNULL EINVAL
driveNULL,而 driveNumberOfElements 為非零 EINVAL
drive 為非 NULL,而 driveNumberOfElements 為零 EINVAL
dirNULL,而 dirNumberOfElements 為非零 EINVAL
dir 為非 NULL,而 dirNumberOfElements 為零 EINVAL
fnameNULL,而 nameNumberOfElements 為非零 EINVAL
fname 為非 NULL,而 nameNumberOfElements 為零 EINVAL
extNULL,而 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