Получение безопасной временной папки в Windows - PullRequest
4 голосов
/ 04 апреля 2011

Мне нужно получить безопасную временную папку, где я мог бы хранить временные файлы для своего приложения, но пока мои исследования привели меня к выводу, что все найденные мной подходы ошибочны.

Первой идеей было использование функции GetTempPath, но это вызывает две проблемы:

  • Папка может не существовать, поэтому мне придется обрезать папки одну за другой до корня и воссоздавать их, если они не существуют обратно по полному пути (подвержен ошибкам, утомителен)
  • Из "WebLog Ларри Остермана" нажмите кажется, что GetTempPath может откатиться к каталогу USERPROFILE или Windows и извлечь целую партию файлов прямо здесь, то есть SUPER BAD (TM)!

В том же посте есть предложение использовать GetEnvironmentVariable, но это мне кажется опасной функцией (например, отсутствие TMP & TEMP envvars).

Можно ли использовать функцию очистки? Кажется, что SHGetKnownFolderPath не имеет ни малейшего представления, что такое временная папка.

Ответы [ 4 ]

3 голосов
/ 04 апреля 2011

Ваша программа, вероятно, не единственная, на которую можно положиться GetTempPath, поэтому разумно ожидать, что она вернёт правильный доступный для записи путь. Тем более что Windows автоматически инициализирует переменные окружения TMP и TEMP; кому-то придется пойти на какие-то неприятности, чтобы переопределить их, и он будет обязан убедиться, что изменения не испортили их систему.

Я хотел бы предположить, что GetTempPath работает правильно, и беспокоиться о сбоях при попытке создания временного файла - в это время могут возникнуть другие ошибки, которые вам необходимо проверить в любом случае.

0 голосов
/ 04 апреля 2011

Ваша первая точка - это решение.Заверните его в метод, чтобы не дублировать код.

0 голосов
/ 04 апреля 2011

Согласно этому ответу , для этого может использоваться библиотека файловой системы Boost.

0 голосов
/ 04 апреля 2011

Идея заключалась бы в том, чтобы получить путь к вашему приложению (GetModuleFileNameEx в сочетании с GetModuleHandle(NULL) и GetCurrentProcess), поскольку этот каталог нельзя удалить из-под windows, если ваше приложение из него запущено (возможноЯ не прав ... несколько лет назад я не мог этого сделать :)) и в этом каталоге создать временный каталог.

...