CreateDirectory("C:\\Users\\Username\\Desktop\\Dir",NULL);
string username = getenv("username");
CreateDirectory(L"C:\\Users\\"+username+"\\Desktop\\Dir",NULL);
Users
располагается на C:
?%USERPROFILE%
, а не заниматься ручным склеиванием кусочков, как в вашем примере. В %USERPROFILE%
содержится полный путь к домашней директории текущего пользователя. От него и начинайте танцевать.+
широкие строковые литералы и узкую std::string
- бесполезное занятие. Почему вы смешиваете широкие и узкие строки в своем коде? Хотите работать с широкими строками - работайте с широкими строками. std::wstring
, а не std::string
. 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` ...
std::wstring
для username
. А вместо экранирования можно либо использовать сырые строки LR"(path\to\file)"
, либо просто писать прямой слэш, а не обратныйL"path/to/file"
. И как правильно уже заметили, используй STL Filesystem. Домашний каталог лучше брать из переменной окружения (environment variable).