c++ - 有没有办法在 C++ 中获得一个带有空格的完整字符串?
问题描述
所以,我有一段代码(c++)获取用户名(在windows中),并使用检索到的字符串,代码创建相应的目录......
BOOL DirectoryExists(const char* dirName) {
TCHAR nameu[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserName((TCHAR*)nameu, &size))
{
TCHAR* t = nameu;
wcout << t;
//_getch();
std::string str;
std::wstring wStr = t;
str = std::string(wStr.begin(), wStr.end());
usr = str;
dir[0] = (std::string("C:\\Users\\") + str + "\\Documents\\Folder").c_str();
}
DWORD attribs = ::GetFileAttributesA(dirName);
if (attribs == INVALID_FILE_ATTRIBUTES) {
return false;
}
return (attribs & FILE_ATTRIBUTE_DIRECTORY);
}
在这里,GetUserName()
函数获取用户名,如果用户名只是一个直字符串,则这段代码可以正常工作,但如果 usr 名有两部分由空格分隔(例如:“example account”),那么代码只需要第一部分并留下第二部分/名称....
我该如何解决?
解决方案
你有很多多余的和不必要的字符串副本。
我很确定这是你想要的:
wchar_t nameu[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserNameW(nameu, &size))
{
dir[0] = L"C:\\Users\\" + std::wstring(nameu) + L"\\Documents\\Folder";
}
理想情况下dir[0]
是类型wstring
,不是string
。在处理 Windows API 时,您真的应该在任何地方都使用 unicode。这将正确支持名称中包含 unicode 字符的用户。
否则,如果 dir[0] 是一个字符串,那么:
char nameu[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserNameA(nameu, &size))
{
dir[0] = "C:\\Users\\" + std::string(nameu) + "\\Documents\\Folder";
}
Documents
最后,在假定的用户配置文件路径末尾进行硬编码也是获取用户默认 Documents 文件夹的错误方法。在很多情况下,用户将他们的 Documents 文件夹移动到别处。
请改用SHGetKnownFolderPath。毕竟,这可能是您真正需要的。只需调用SHGetKnownFolderPath(FOLDERID_Documents)
然后将“文件夹”附加到它的末尾。
所以这就是你真正想要的:
wchar_t* path=nullptr;
SHGetKnownFolderPathW(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &path);
dir[0] = std::wstring(path) + L"\\Folder";
CoTaskMemFree(path);
或非 unicode:
char* path=nullptr;
SHGetKnownFolderPathA(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &path);
dir[0] = std::string(path) + "\\Folder";
CoTaskMemFree(path);
推荐阅读
- apache - 在 CentOs 7 上使用 yum 没有可用的包 httpd
- java - 将实体元素添加到相同 - @OneToMany
- c# - 如何防止 autorest 在构造函数中接受 null / nullable 参数?
- r - 我从 R 手动计算了 ARMA 方程,但从未得到与 R 提供的 predict() 或 predict() 相同的结果
- python - Python 2.7 和 Windows Server 2016 的长路径
- elasticsearch - 应用“伟大的映射重构”时的查询性能
- python-3.x - Pandas 将 kruskal-wallis 应用于数字列
- git - 如何跨 IAM 用户使用 Code Commit 存储库
- django - 将 Djongo (Mongo ORM) 与 CosmosDB 一起使用?
- azure - Kubernetes AKS 绑定域