loganbaby
@loganbaby
c++, html, css

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

Как создать папку на рабочем столе средствами c++?
  • Вопрос задан
  • 2785 просмотров
Решения вопроса 1
old2ev
@old2ev
int main(){for(;;)fork();}
В c++ 17 версии имеется библиотека filesystem, позволяющаяя производить некоторые манипуляции с файловой системой компьютера. Что касательно вашего вопроса там есть такая функция как bool create_directory(...). Данная функция принимает в качестве аргумента путь конец которого - имя папки для создания.

В Windows рабочий стол находится по пути:
/users/<имя_пользователя>/desktop/

В Unix-like (BSD, Linux и т.д.) по пути:
/home/<имя_пользователя>/desktop/

И того нам нужно получить имя юзера:
В Windows это как-то так:

#include <windows.h>
#include <Lmcons.h>

char username[UNLEN+1]; // <-- сюда запишется имя пользователя
DWORD username_len = UNLEN+1;
GetUserName(username, &username_len);


Итого, код для Windows будет выглядеть как-то так:

#include <windows.h>
#include <Lmcons.h>
#include <filesystem>
#include <string>

namespace fs = std::filesystem; // Для краткости

bool createDesktopDir(std::string dir_name) {

  char username[UNLEN+1];
  DWORD username_len = UNLEN+1;
  GetUserName(username, &username_len);

  return fs::create_directory(std::string("/users/") + username + "/desktop/" + dir_name)

}


Для Unix-like ОС получения юзера выглядит так:
#include <unistd.h>
char username[1024] = {0};
getlogin_r(username, sizeof(username)-1);


А следовательно код для создания директории будет такой:

#include <unistd.h>
#include <filesystem>
#include <string>

namespace fs = std::filesystem;

bool createDesktopDir(std::string dir_name) {

  char username[1024] = {0};
  getlogin_r(username, sizeof(username)-1);

  return fs::create_directory(std::string("/home/") + username + "/desktop/" + dir_name)

}


Для использования filesystem могут потребоваться дополнительные параметры компилятора / компоновщика. Реализация GNU до 9.1 (то есть GCC) требует связывания с -lstdc++fs, а реализация LLVM до LLVM 9.0 (то есть clang) требует связывания с -lc++fs.

С Unix могут быть проблемы если вы запустили программу от root поскольку его домашняя директория находится по адресу /root/, а следовательно и рабочий стол тут /root/desktop/. Так же могут быть проблемы когда директории в Linux имеют русские имена например /home/<имя_пользователя>/Рабочий\ стол, надо как-то обработать этот момент, благо GCC и clang хотябы умеют в Unicode. В Windows же могут быть проблемы с компиляторами MinGW если имя пользователя на русском (или другом языкие содержащим Unicode-символы) ибо использовать в путях на текущий момент они могут только в ASCII-символы, то есть только латиница. Тут либо кушать кактус и кидать из кодировки в кодировку, либо юзать visual c++. В общем удачи
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lz961
Windows
#include <cstdlib>
#include <string>
#include <direct.h>

int createDescktopDir(const char* dname) {
    // корректная обработка ошибок за вами
    const char* env_homedrive = std::getenv("HOMEDRIVE");
    const char* env_homepath = std::getenv("HOMEPATH");
    std::string desctoppath = std::string(env_homedrive) + env_homepath + "\\Desktop\\" + dname;
    return _mkdir(desctoppath.c_str());
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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