У вас много избыточных и ненужных копий строк.
Я почти уверен, что это именно то, что вы хотите:
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
. Вам действительно следует использовать Unicode везде, когда имеете дело с Windows API. Это обеспечит правильную поддержку пользователей с символами Юникода в их имени.
В противном случае, если dir [0] является строкой, то это:
char nameu[UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserNameA(nameu, &size))
{
dir[0] = "C:\\Users\\" + std::string(nameu) + "\\Documents\\Folder";
}
И, наконец, жестко запрограммированный Documents
в конец предполагаемого пути к профилю пользователя также является неправильным способом получения папки документов пользователя по умолчанию. Существует множество сценариев ios, когда пользователи перемещают свои папки «Документы» в другое место.
Вместо этого используйте 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);
Или не-юникод:
char* path=nullptr;
SHGetKnownFolderPathA(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &path);
dir[0] = std::string(path) + "\\Folder";
CoTaskMemFree(path);