Я пишу проблему на С++. Он должен работать как с ОС Windows, так и с ОС Unix.
Как получить пользовательскую или системную папку tmp на разных ОС?
Я пишу проблему на С++. Он должен работать как с ОС Windows, так и с ОС Unix.
Как получить пользовательскую или системную папку tmp на разных ОС?
Обновление: спасибо @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
, особенно если вам нужны определенные приоритеты/требования к порядку или вы не хотите использовать другую библиотеку.
Используйте переменную среды $TMPDIR
, в соответствии с POSIX.
char const *folder = getenv("TMPDIR");
if (folder == 0)
folder = "/tmp";
если вы используете QT (Core), вы можете попробовать QString QDir::tempPath()
или использовать его в своем коде (QT открыт, поэтому проверьте, как они это делают).
Док говорит: в системах Unix/Linux это обычно /tmp; в Windows это обычно путь в переменной среды TEMP или TMP.
Удобная функция:
std::string getEnvVar( std::string const & key )
{
char * val = getenv( key.c_str() );
return val == NULL ? std::string("") : std::string(val);
}
Я думаю, что TEMP или что-то может быть передано в качестве аргумента? В зависимости от ОС, конечно. getenv является частью stdlib, поэтому это также должно быть переносимым.
Если вы получаете доступ к главному() функциональному коду, может быть лучше указать нужные имена папок через main() ** argv и использовать пакетную программу запуска OS. Например, для UNIX
bash a_launcher.sh
где a_launcher.sh похоже на
./a.out /tmp
В Windows: используйте GetTempPath(), чтобы получить путь к каталогу, предназначенному для временных файлов.
wstring TempPath;
wchar_t wcharPath[MAX_PATH];
if (GetTempPathW(MAX_PATH, wcharPath))
TempPath = wcharPath;