Программист интересующийся разработкой приложений на языках C/C++.
Контакты

Наибольший вклад в теги

Все теги (5)

Лучшие ответы пользователя

Все ответы (4)
  • Как создать папку на рабочем столе средствами c++?

    @old2ev
    C/C++ программист-энтузиаст
    В 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 комментарий