本文主要是介绍C++中::SHCreateDirectoryEx函数使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir...
在 C++ 中, ::SHCreateDirectoryEx
是 Windows Shell API 提供的函数,用于创建多级目录(类似于 mkdir -p
命令)。与标准库的 CreateDirectory
不同,它可以自动创建路径中缺失的中间目录。以下是详细使用方法及示例:
1. 函数原型与依赖项
#include <vbvZBnTI;Windows.h> #include <Shlobj.h> // 包含头文件 #pragma comment(lib, "Shell32.lib") // 链接 Shell32 库 int SHCreateDirectoryEChina编程x( _In_opt_ HWND hwnd, // 父窗口句柄(可设为 NULL) _In_ LPCTSTR pszPath, // 要创建的目录路径 _In_opt_ const SECURITY_ATTRIBUTES *psa // 安全属性(通常为 NULL) );
返回值:
0
(ERROR_SUCCESS
):创建成功。- 非零值:错误代码(可通过
GetLastError()
获取详细错误信息)。
2. 基本使用示例
示例 1:创建单层目录
#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"目录创建成功: " << path << std::endl; } else { std::wcerr << L"错误代码: " << result << std::endl; } return 0; }
示例 2:创建多级目录
LPCWSTR path = L"C:\\Parent\\Child\\Grandchild"; // 自动创建中间缺失的目录 int result = ::SHCreateDirectoryEx(NULL, path, NULL);
3. 关键注意事项
(1) Unicode 与多字节字符集
推荐使用 Unicode 版本:Windows API 默认优先使用宽字符(WCHAR
/LPCWSTR
)。
若使用多字节字符集(char
),需显式转换路径:
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) 错误处理
通过返回值判断是否成功,结合 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:路径权限不足
- 表现:返回错误代码
5
(ERROR_Access_DENIED
)。 - 解决:
- 以管理员权限运行程序(右键 → 以管理员身份运行)。
- 修改目标目录权限(右键目录 → 属性 → 安全 → 编辑权限)。
问题 2:路径无效或包含非法字符
- 表现:返回错误代码
123
(ERROR_INVALID_NAME
)。 - 解决:检查路径是否包含
<
,>
,:
,"
,|
,?
,*
等非法字符。
问题 3:磁盘空间不足
- 表现:编程返回错误代码
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 文件系统库
#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; } }
总结
::SandroidHCreateDirectoryEx
是 Windows 平台下创建多级目录的高效工具,适合需要兼容旧版系统或直接使用 Shell API 的场景。- 使用时需注意 路径格式、字符编码 及 错误处理。
- 对于新项目,优先考虑 C++17 的
<filesystem>
或 Boost 库,代码更简洁且跨平台。
到此这篇关于C++中::SHCreateDirectoryEx函数使用方法的文章就介绍到这了,更多相关C++ ::SHCreateDirecChina编程toryEx内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于C++中::SHCreateDirectoryEx函数使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!