@al3x3y77

Как создать папку с учетом имени пользователя c++?

Как создать папку, на рабочем столе, если имя юзера не известно?
Обычный способ работает
CreateDirectory("C:\\Users\\Username\\Desktop\\Dir",NULL);

А если попытаться поставить имя юзера из переменной, то выдает ошибку
string username = getenv("username");	
CreateDirectory(L"C:\\Users\\"+username+"\\Desktop\\Dir",NULL);
  • Вопрос задан
  • 664 просмотра
Решения вопроса 2
@TheCalligrapher
А почему вы вообще решили, что папка Users располагается на C:?

Создавать папки в домашней директории пользователя следует через значение переменной окружения %USERPROFILE%, а не заниматься ручным склеиванием кусочков, как в вашем примере. В %USERPROFILE% содержится полный путь к домашней директории текущего пользователя. От него и начинайте танцевать.

И пытаться конкатенировать через + широкие строковые литералы и узкую std::string - бесполезное занятие. Почему вы смешиваете широкие и узкие строки в своем коде? Хотите работать с широкими строками - работайте с широкими строками. std::wstring, а не std::string.
Ответ написан
@MarkusD Куратор тега C++
все время мелю чепуху :)
Для современных версий ОС Windows в наборе WinAPI присутствует функция SHGetKnownFolderPath[?].
Она позволяет получить путь к некоторым предварительно определенным папкам, набор которых описан абстракцией KNOWNFOLDERID[?].

Тебе подойдет FOLDERID_Desktop для получения папки рабочего стола пользователя.
При работе с этой функцией очень важно не забывать пользоваться функцией CoTaskMemFree[?] для освобождения памяти, переданной из функции через указатель ppszPath.

Небольшой пример использования
wchar_t* path_buffer = nullptr;
if( FAILED( ::SHGetKnownFolderPath( FOLDERID_Desktop, KF_FLAG_DEFAULT, 0, &path_buffer ) ) )
{
	::CoTaskMemFree( path_buffer );
	LOG_ERROR( LOG_CHANNEL, "Failed to get known directory; error - #{:08X}.", ::GetLastError() );
	// terminate ...
}

std::wstring user_desktop_path{ path_buffer };
::CoTaskMemFree( path_buffer );

// whatever with `user_desktop_path` ...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
EgoRusMarch
@EgoRusMarch
C++ Developer
Так ты используй std::wstring для username. А вместо экранирования можно либо использовать сырые строки LR"(path\to\file)", либо просто писать прямой слэш, а не обратныйL"path/to/file". И как правильно уже заметили, используй STL Filesystem. Домашний каталог лучше брать из переменной окружения (environment variable).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы