VS2017 C++中CreateDirectory无法创建目录的原因排查
解决VS2017中CreateDirectory无法创建目录的问题
首先说核心问题:你这段代码的问题几乎肯定是字符集不匹配导致的。VS2017新建的C++项目默认启用Unicode字符集,而你用的std::string是ANSI编码的字符串,强行转成LPCTSTR会出现编码乱码,让CreateDirectory根本认不出你指定的路径。
下面给你几个可行的解决办法:
方法一:切换项目字符集到多字节(最省事,不用改代码)
- 右键你的项目 → 选择「属性」
- 找到「配置属性」→「常规」选项卡
- 把「字符集」从「使用 Unicode 字符集」改成「使用多字节字符集」
- 重新编译运行,你的原有代码应该就能正常生成
C:\Screenshots文件夹了
方法二:用宽字符串适配Unicode(不修改项目设置)
如果不想动项目的字符集配置,直接用宽字符串写代码即可:
std::wstring folderfile = L"C:\\Screenshots"; CreateDirectory(folderfile.c_str(), NULL);
要是你坚持想用std::string,也可以通过Windows API把ANSI字符串转成宽字符串:
#include <string> #include <windows.h> int main() { std::string folderfile = "C:\\Screenshots"; // 先计算需要的宽字符串长度 int wideSize = MultiByteToWideChar(CP_ACP, 0, folderfile.c_str(), -1, NULL, 0); std::wstring wideFolder(wideSize, 0); // 执行转换 MultiByteToWideChar(CP_ACP, 0, folderfile.c_str(), -1, &wideFolder[0], wideSize); // 调用CreateDirectory if (!CreateDirectory(wideFolder.c_str(), NULL)) { // 获取错误码排查问题 DWORD errCode = GetLastError(); // 常见错误码:ERROR_ALREADY_EXISTS(目录已存在)、ERROR_ACCESS_DENIED(权限问题) } return 0; }
额外小技巧:用GetLastError()定位具体问题
不管用哪种方法,都可以通过GetLastError()获取API调用失败的具体错误码,这对排查这类问题非常有用。比如返回ERROR_ALREADY_EXISTS说明目录已经存在,返回ERROR_PATH_NOT_FOUND则可能是路径中的上级目录不存在(不过你这里是根目录,这个可能性很低)。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

