在圖像處理、數據分析流程中,常需將處理結果保存到「輸入文件所在目錄下、以文件名命名的子目錄」中。本文封裝一個跨平台兼容的工具類 CreateSubfolder,基於 CRT _splitpath / _mkdir 實現。
CreateSubfolder.h#ifndef CREATE_SUBFOLDER_H
#define CREATE_SUBFOLDER_H
#include <string>
#include <direct.h> // _mkdir, _splitpath
#include <stdlib.h> // _MAX_* 常量
class CreateSubfolder {
public:
CreateSubfolder() = default;
~CreateSubfolder() = default;
// filepath: 輸入完整路徑
// subfolder: 輸出創建的子目錄完整路徑
// filename: 輸出不含擴展名的文件名
static void creatSubfolderViaFname(const char* filepath,
char* subfolder,
char* filename);
};
#endif // CREATE_SUBFOLDER_H
CreateSubfolder.cpp#include "CreateSubfolder.h"
#include <stdio.h> // sprintf
void CreateSubfolder::creatSubfolderViaFname(const char* filepath,
char* subfolder,
char* filename) {
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
// 1. 拆解路徑:驅動器、目錄、文件名、擴展名
_splitpath(filepath, drive, dir, fname, ext);
// 2. 組裝新目錄:原目錄 + 文件名 + 反斜槓
char subDir[_MAX_DIR];
sprintf(subDir, "%s%s\\", dir, fname); // 相對路徑部分
// 3. 完整路徑 = 驅動器 + 相對路徑
sprintf(subfolder, "%s%s", drive, subDir);
// 4. 創建目錄(若已存在 _mkdir 返回非 0,忽略即可)
_mkdir(subfolder);
// 5. 返回純文件名
sprintf(filename, "%s", fname);
}
int main() {
const char* imgPath = "E:\\data\\lena32.jpg";
char subfolder[_MAX_PATH], filename[_MAX_FNAME];
CreateSubfolder::creatSubfolderViaFname(imgPath, subfolder, filename);
// subfolder = "E:\\data\\lena32\\"
// filename = "lena32"
// 後續可直接用 subfolder 保存處理結果
// cv::imwrite(subfolder + "contour_1.png", ...);
return 0;
}
輸入圖片 lena32.jpg → 自動創建 lena32/ 子目錄 → 將提取的輪廓、分割圖等結果按序號保存其中。

_splitpath / _mkdir(MSVC CRT)。dirname/basename + mkdir -p 或 C++17 std::filesystem::create_directories。std::filesystem 統一處理,更現代、更安全。