Как получить временную папку для текущего пользователя

В настоящее время я использую следующую функцию для получения временного пути к папке для текущего пользователя:

string tempPath = System.IO.Path.GetTempPath();

На некоторых машинах он дает мне временный путь папки текущего пользователя, например:

C:\Documents and Settings\administrator\Local Settings\Temp\

На некоторых машинах он дает мне путь к файловой системе temp, например:

C:\Windows\TEMP

В документации MSDN также говорится, что выше API возвращает текущую временную папку системы.

Есть ли какой-либо другой доступный API, который дает мне текущий путь к временной папке пользователя следующим образом:

C:\Documents and Settings\administrator\Local Settings\Temp\

Ответ 1

System.IO.Path.GetTempPath() - это просто оболочка для нативного вызова GetTempPath(..) в Kernel32.

Посмотрите http://msdn.microsoft.com/en-us/library/aa364992 (VS.85).aspx

Скопировано с этой страницы:

Функция GetTempPath проверяет наличие переменных окружения в следующем порядке и использует первый найденный путь:

  • Путь, указанный переменной среды TMP.
  • Путь, указанный переменной среды TEMP.
  • Путь, указанный переменной среды USERPROFILE.
  • Каталог Windows.

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

Таким образом, объединяя эту страницу с вашим сообщением, я бы предположил, что либо одна из переменных TMP, TEMP или USERPROFILE для вашего пользователя-администратора указывает на путь к окну, либо они не установлены, и он берет резервную копию окна temp путь.

Ответ 2

НЕ используйте:

System.Environment.GetEnvironmentVariable("TEMP")

Переменные окружения могут быть переопределены, поэтому переменная TEMP не обязательно является каталогом.

Правильный способ - использовать System.IO.Path.GetTempPath() как в принятом ответе.

Ответ 3

У меня есть это же требование - мы хотим поместить журналы в определенный корневой каталог, который должен существовать в среде.

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

Если я хочу объединить это с подкаталогом, я должен использовать Path.Combine( ... ).

Метод GetFolderPath имеет перегрузку для специальных опций папки, которая позволяет вам управлять созданием или просто проверкой указанного пути.

Ответ 4

попробовать

Environment.GetEnvironmentVariable("temp");