Как получить временную папку для текущего пользователя - PullRequest
370 голосов
/ 03 июня 2009

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

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

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

C: \ Documents and Settings \ администратор \ Локальные настройки \ Temp \

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

C: \ Windows \ TEMP

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

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

C: \ Documents and Settings \ администратор \ Локальные настройки \ Temp \

Ответы [ 4 ]

389 голосов
/ 03 июня 2009

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

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

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

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

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

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

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

26 голосов
/ 03 июня 2009

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

System.Environment.GetEnvironmentVariable("TEMP")

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

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

20 голосов
/ 21 июня 2012

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

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

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

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

0 голосов
/ 03 июня 2009

1001 * попробовать *

Environment.GetEnvironmentVariable("temp");
...