@al3x3y77

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

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

А если попытаться поставить имя юзера из переменной, то выдает ошибку
string username = getenv("username");	
CreateDirectory(L"C:\\Users\\"+username+"\\Desktop\\Dir",NULL);
  • Вопрос задан
  • 726 просмотров
Решения вопроса 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).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы