首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 根據文件路徑自動創建同名子目錄工具類

     編輯:關於C++

在圖像處理、數據分析流程中,常需將處理結果保存到「輸入文件所在目錄下、以文件名命名的子目錄」中。本文封裝一個跨平台兼容的工具類 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/ 子目錄 → 將提取的輪廓、分割圖等結果按序號保存其中。

原始圖片 結果目錄結構 子目錄下生成的文件

五、跨平台提示

  • Windows:直接用 _splitpath / _mkdir(MSVC CRT)。
  • Linux/macOS:替換為 dirname/basename + mkdir -p 或 C++17 std::filesystem::create_directories。
  • C++17 專案建議直接用 std::filesystem 統一處理,更現代、更安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved