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) );
返回值:
0(ERROR_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):返回錯誤代碼
5(ERROR_ACCESS_DENIED)。 - 解決:
- 以管理員權(quán)限運行程序(右鍵 → 以管理員身份運行)。
- 修改目標目錄權(quán)限(右鍵目錄 → 屬性 → 安全 → 編輯權(quán)限)。
問題 2:路徑無效或包含非法字符
- 表現(xiàn):返回錯誤代碼
123(ERROR_INVALID_NAME)。 - 解決:檢查路徑是否包含
<,>,:,",|,?,*等非法字符。
問題 3:磁盤空間不足
- 表現(xiàn):返回錯誤代碼
112(ERROR_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++之CNoTrackObject類和new delete操作符的重載實例
這篇文章主要介紹了C++之CNoTrackObject類和new delete操作符的重載實例,是C++程序設(shè)計中比較重要的概念,需要的朋友可以參考下2014-10-10

