Есть ли способ получить полную строку с пробелами в c ++? - PullRequest
0 голосов
/ 28 мая 2020

Итак, у меня есть фрагмент кода (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 состоит из двух частей, разделенных пробелом (например, «пример учетной записи»), тогда код принимает только первая часть и оставляет вторую часть / имя ....

как мне решить эту проблему?

1 Ответ

3 голосов
/ 28 мая 2020

У вас много избыточных и ненужных копий строк.

Я почти уверен, что это именно то, что вы хотите:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...