最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中::SHCreateDirectoryEx函數(shù)使用方法

 更新時間:2025年03月24日 10:53:15   作者:SunkingYang  
::SHCreateDirectoryEx用于創(chuàng)建多級目錄,類似于mkdir -p命令,本文主要介紹了C++中::SHCreateDirectoryEx函數(shù)使用方法,具有一定的參考價值,感興趣的可以了解一下

在 C++ 中, ::SHCreateDirectoryEx 是 Windows Shell API 提供的函數(shù),用于創(chuàng)建多級目錄(類似于 mkdir -p 命令)。與標準庫的 CreateDirectory 不同,它可以自動創(chuàng)建路徑中缺失的中間目錄。以下是詳細使用方法及示例:

1. 函數(shù)原型與依賴項

#include <Windows.h>
#include <Shlobj.h>  // 包含頭文件
#pragma comment(lib, "Shell32.lib")  // 鏈接 Shell32 庫

int SHCreateDirectoryEx(
  _In_opt_ HWND                hwnd,         // 父窗口句柄(可設(shè)為 NULL)
  _In_     LPCTSTR             pszPath,      // 要創(chuàng)建的目錄路徑
  _In_opt_ const SECURITY_ATTRIBUTES *psa    // 安全屬性(通常為 NULL)
);

返回值

  • 0ERROR_SUCCESS):創(chuàng)建成功。
  • 非零值:錯誤代碼(可通過 GetLastError() 獲取詳細錯誤信息)。

2. 基本使用示例

示例 1:創(chuàng)建單層目錄

#include <Windows.h>
#include <Shlobj.h>
#include <iostream>

int main() {
    LPCWSTR path = L"C:\\MyFolder";  // 寬字符路徑(Unicode)

    int result = ::SHCreateDirectoryEx(
        NULL,        // 無父窗口
        path,        // 目錄路徑
        NULL         // 默認安全屬性
    );

    if (result == ERROR_SUCCESS) {
        std::wcout << L"目錄創(chuàng)建成功: " << path << std::endl;
    } else {
        std::wcerr << L"錯誤代碼: " << result << std::endl;
    }

    return 0;
}

示例 2:創(chuàng)建多級目錄

LPCWSTR path = L"C:\\Parent\\Child\\Grandchild";  // 自動創(chuàng)建中間缺失的目錄
int result = ::SHCreateDirectoryEx(NULL, path, NULL);

3. 關(guān)鍵注意事項

(1) Unicode 與多字節(jié)字符集

推薦使用 Unicode 版本:Windows API 默認優(yōu)先使用寬字符(WCHAR/LPCWSTR)。

若使用多字節(jié)字符集(char),需顯式轉(zhuǎn)換路徑:

LPCSTR pathA = "C:\\MyFolder";
WCHAR pathW[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, pathA, -1, pathW, MAX_PATH);
::SHCreateDirectoryEx(NULL, pathW, NULL);

(2) 路徑格式

使用 雙反斜杠 \\ 或 正斜杠 / 作為分隔符:

LPCWSTR path1 = L"C:/MyFolder/Subdir";  // 正斜杠
LPCWSTR path2 = L"C:\\MyFolder\\Subdir"; // 雙反斜杠

(3) 錯誤處理

通過返回值判斷是否成功,結(jié)合 GetLastError() 獲取詳細信息:

if (result != ERROR_SUCCESS) {
    DWORD error = ::GetLastError();
    LPWSTR errorMsg = nullptr;
    ::FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        error,
        0,
        (LPWSTR)&errorMsg,
        0,
        NULL
    );
    std::wcerr << L"錯誤: " << errorMsg << std::endl;
    ::LocalFree(errorMsg);
}

4. 常見問題與解決方案

問題 1:路徑權(quán)限不足

  • 表現(xiàn):返回錯誤代碼 5ERROR_ACCESS_DENIED)。
  • 解決
    • 以管理員權(quán)限運行程序(右鍵 → 以管理員身份運行)。
    • 修改目標目錄權(quán)限(右鍵目錄 → 屬性 → 安全 → 編輯權(quán)限)。

問題 2:路徑無效或包含非法字符

  • 表現(xiàn):返回錯誤代碼 123ERROR_INVALID_NAME)。
  • 解決:檢查路徑是否包含 <>:"|?* 等非法字符。

問題 3:磁盤空間不足

  • 表現(xiàn):返回錯誤代碼 112ERROR_DISK_FULL)。
  • 解決:清理磁盤或選擇其他存儲位置。

5. 替代方案

(1) 使用標準庫 <filesystem>(C++17 及以上)

#include <filesystem>
namespace fs = std::filesystem;

bool createDirectory(const std::wstring& path) {
    try {
        return fs::create_directories(path);
    } catch (const fs::filesystem_error& e) {
        std::wcerr << L"錯誤: " << e.what() << std::endl;
        return false;
    }
}

(2) 使用 Boost 文件系統(tǒng)庫

#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;

bool createDirectory(const std::string& path) {
    try {
        return fs::create_directories(path);
    } catch (const fs::filesystem_error& e) {
        std::cerr << "錯誤: " << e.what() << std::endl;
        return false;
    }
}

總結(jié)

  • ::SHCreateDirectoryEx 是 Windows 平臺下創(chuàng)建多級目錄的高效工具,適合需要兼容舊版系統(tǒng)或直接使用 Shell API 的場景。
  • 使用時需注意 路徑格式、字符編碼 及 錯誤處理。
  • 對于新項目,優(yōu)先考慮 C++17 的 <filesystem> 或 Boost 庫,代碼更簡潔且跨平臺。

到此這篇關(guān)于C++中::SHCreateDirectoryEx函數(shù)使用方法的文章就介紹到這了,更多相關(guān)C++ ::SHCreateDirectoryEx內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C實現(xiàn)分子沉積模擬的示例代碼

    C實現(xiàn)分子沉積模擬的示例代碼

    這篇文章主要介紹了計算機在材料科學(xué)中的一個練習(xí)題,功能是模擬氣化后分子沉積
    2013-11-11
  • c語言實現(xiàn)的幾種常用排序算法

    c語言實現(xiàn)的幾種常用排序算法

    C,語言常用的排序方法有很多種。比如說冒泡排序,直接交換排序,直接選擇排序,直接插入排序,二分插入排序,快速排序,歸并排序等等,下面這篇文章主要給大家介紹了關(guān)于c語言實現(xiàn)幾種常用的排序算法,需要的朋友可以參考下
    2021-06-06
  • C語言中將日期和時間以字符串格式輸出的方法

    C語言中將日期和時間以字符串格式輸出的方法

    這篇文章主要介紹了C語言中將日期和時間以字符串格式輸出的方法,分別是ctime()函數(shù)和asctime()函數(shù),注意參數(shù)區(qū)別,需要的朋友可以參考下
    2015-08-08
  • 使用root權(quán)限運行自己所編譯程序的解決方法

    使用root權(quán)限運行自己所編譯程序的解決方法

    本篇文章介紹了,使用root權(quán)限運行自己所編譯程序的解決方法。需要的朋友參考下
    2013-05-05
  • 淺談C++反向迭代器的設(shè)計

    淺談C++反向迭代器的設(shè)計

    本文主要介紹了淺談C++反向迭代器的設(shè)計,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 遞歸刪除二叉樹中以x為根的子樹

    遞歸刪除二叉樹中以x為根的子樹

    今天小編就為大家分享一篇關(guān)于遞歸刪除二叉樹中以x為根的子樹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • AVX2指令集優(yōu)化浮點數(shù)組求和算法

    AVX2指令集優(yōu)化浮點數(shù)組求和算法

    這篇文章主要為大家介紹了AVX2指令集優(yōu)化浮點數(shù)組求和算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • C語言實現(xiàn)俄羅斯方塊課程設(shè)計

    C語言實現(xiàn)俄羅斯方塊課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)俄羅斯方塊課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++之CNoTrackObject類和new delete操作符的重載實例

    C++之CNoTrackObject類和new delete操作符的重載實例

    這篇文章主要介紹了C++之CNoTrackObject類和new delete操作符的重載實例,是C++程序設(shè)計中比較重要的概念,需要的朋友可以參考下
    2014-10-10
  • C++線程同步實例分析

    C++線程同步實例分析

    這篇文章主要介紹了C++線程同步實例分析,以實例的形式較為深入的分析了C++的線程同步問題,是一個較為經(jīng)典的線程同步問題,需要的朋友可以參考下
    2014-10-10

最新評論

石门县| 色达县| 伽师县| 兖州市| 恭城| 伊川县| 新沂市| 赤水市| 遂平县| 阿勒泰市| 溆浦县| 巴彦淖尔市| 静乐县| 武山县| 沙湾县| 巩留县| 甘孜| 板桥市| 富阳市| 长岭县| 汶上县| 巴彦县| 卢湾区| 永靖县| 正定县| 博湖县| 房产| 体育| 新晃| 汝州市| 万宁市| 沁水县| 手游| 米林县| 山丹县| 寻乌县| 论坛| 博湖县| 七台河市| 库尔勒市| 廉江市|