Подтвердить что ты не робот

Как получить системную или временную папку пользователя в unix и windows?

Я пишу проблему на С++. Он должен работать как с ОС Windows, так и с ОС Unix.

Как получить пользовательскую или системную папку tmp на разных ОС?

4b9b3361

Ответ 1

Обновление: спасибо @RoiDanton, самый последний ответ - std::filesystem::temp_directory_path (С++ 17)


Попробуйте boost::filesystem temp_directory_path(), который внутренне использует:

  • ISO/IEC 9945 (POSIX): путь, предоставленный первой переменной окружения, найденной в списке TMPDIR, TMP, TEMP, TEMPDIR. Если ни одно из них не найдено, "/tmp".

  • Windows: путь, сообщенный функцией API GetTempPath.

Интересно, что Window GetTempPath использует аналогичную логику для версии POSIX: первая переменная среды в списке TMP, TEMP, USERPROFILE. Если ни один из них не найден, он возвращает каталог Windows.

Тот факт, что эти методы в первую очередь полагаются на переменные окружения, кажется немного унылым. Но вот как это, по-видимому, определяется. Если вы считаете, насколько это обыденно, вы можете легко свернуть свой собственный, используя функцию cstdlib getenv, особенно если вам нужны определенные приоритеты/требования к порядку или вы не хотите использовать другую библиотеку.

Ответ 2

Используйте переменную среды $TMPDIR, в соответствии с POSIX.

char const *folder = getenv("TMPDIR");
if (folder == 0)
    folder = "/tmp";

Ответ 3

если вы используете QT (Core), вы можете попробовать QString QDir::tempPath() или использовать его в своем коде (QT открыт, поэтому проверьте, как они это делают).

Док говорит: в системах Unix/Linux это обычно /tmp; в Windows это обычно путь в переменной среды TEMP или TMP.

Ответ 4

Удобная функция:

std::string getEnvVar( std::string const & key )
{
    char * val = getenv( key.c_str() );
    return val == NULL ? std::string("") : std::string(val);
}

Я думаю, что TEMP или что-то может быть передано в качестве аргумента? В зависимости от ОС, конечно. getenv является частью stdlib, поэтому это также должно быть переносимым.

Ответ 5

Если вы получаете доступ к главному() функциональному коду, может быть лучше указать нужные имена папок через main() ** argv и использовать пакетную программу запуска OS. Например, для UNIX

bash a_launcher.sh

где a_launcher.sh похоже на

./a.out /tmp

Ответ 6

В Windows: используйте GetTempPath(), чтобы получить путь к каталогу, предназначенному для временных файлов.

wstring TempPath;
wchar_t wcharPath[MAX_PATH];
if (GetTempPathW(MAX_PATH, wcharPath))
  TempPath = wcharPath;