欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1. 函數(shù)原型與依賴(lài)項(xiàng)

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

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

返回值

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

2. 基本使用示例

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

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

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

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

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

    return 0;
}

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

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

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

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

推薦使用 Unicode 版本:Windows API 默認(rèn)優(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) 錯(cuò)誤處理

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

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"錯(cuò)誤: " << errorMsg << std::endl;
    ::LocalFree(errorMsg);
}

4. 常見(jiàn)問(wèn)題與解決方案

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

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

問(wèn)題 2:路徑無(wú)效或包含非法字符

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

問(wèn)題 3:磁盤(pán)空間不足

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

5. 替代方案

(1) 使用標(biāo)準(zhǔn)庫(kù) <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"錯(cuò)誤: " << e.what() << std::endl;
        return false;
    }
}

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

#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 << "錯(cuò)誤: " << e.what() << std::endl;
        return false;
    }
}

總結(jié)

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理

    C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理

    這篇文章主要介紹了C++實(shí)現(xiàn)簡(jiǎn)單的ls命令及其原理,C++實(shí)現(xiàn)ls命令可通過(guò)調(diào)用系統(tǒng)函數(shù)實(shí)現(xiàn)讀取目錄中的文件名和屬性,再通過(guò)標(biāo)準(zhǔn)輸出進(jìn)行顯示,需要的朋友可以參考下
    2023-05-05
  • 基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲的示例代碼

    基于C語(yǔ)言實(shí)現(xiàn)三子棋游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言數(shù)組實(shí)現(xiàn)簡(jiǎn)單的三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取

    C語(yǔ)言數(shù)據(jù)的存儲(chǔ)超詳細(xì)講解下篇浮點(diǎn)型在內(nèi)存中的存取

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類(lèi)型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類(lèi)型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-04-04
  • C語(yǔ)言控制臺(tái)打磚塊小游戲

    C語(yǔ)言控制臺(tái)打磚塊小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言控制臺(tái)打磚塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)詳解

    C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)詳解

    對(duì)于數(shù)組想必大家都不陌生首先得要知道的是對(duì)于數(shù)組元素在內(nèi)存存儲(chǔ)是連續(xù)性的,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言多維數(shù)組數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • 用c++實(shí)現(xiàn)x的y次冪的代碼

    用c++實(shí)現(xiàn)x的y次冪的代碼

    以下實(shí)例是對(duì)使用c++實(shí)現(xiàn)x的y次冪的解決方法進(jìn)行了介紹。需要的朋友參考下
    2013-05-05
  • 解析C++中四種強(qiáng)制類(lèi)型轉(zhuǎn)換的區(qū)別詳解

    解析C++中四種強(qiáng)制類(lèi)型轉(zhuǎn)換的區(qū)別詳解

    本篇文章是對(duì)C++中四種強(qiáng)制類(lèi)型轉(zhuǎn)換的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言實(shí)現(xiàn)手機(jī)電話(huà)簿管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)手機(jī)電話(huà)簿管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)手機(jī)電話(huà)簿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于C語(yǔ)言航班信息查詢(xún)與檢索

    基于C語(yǔ)言航班信息查詢(xún)與檢索

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言航班信息查詢(xún)與檢索,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++模擬實(shí)現(xiàn)vector示例代碼圖文講解

    C++模擬實(shí)現(xiàn)vector示例代碼圖文講解

    這篇文章主要介紹了C++容器Vector的模擬實(shí)現(xiàn),Vector是一個(gè)能夠存放任意類(lèi)型的動(dòng)態(tài)數(shù)組,有點(diǎn)類(lèi)似數(shù)組,是一個(gè)連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下
    2023-02-02

最新評(píng)論