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

395

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

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

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

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

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

C: \ Windows \ TEMP

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

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

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

Anoop
источник
2
Поведение System.Environment.GetEnvironmentVariable ("TEMP") такое же, как GetTempPath (). На моей машине для учетной записи «администратор» оба API возвращают «C: \ WINDOWS \ TEMP», но для учетной записи «Сетевая служба» оба API возвращают «C: \ Documents and Settings \ Сетевая служба \ Локальные настройки \ Temp \».
Anoop
1
Возможно, учетная запись администратора имеет временную папку C: \ Windows \ Temp?
Хелен
2
Есть ли какая-то конкретная причина, по которой вы хотите получить временный путь в C: \ Documents and Settings \ всегда?
Нолдорин
11
FYI: если вы действительно хотите папку системы временный, а не (если он установлен) пользователя можно использовать Environment.GetEnvironmentVariable ( «Темп», EnvironmentVariableTarget.Machine)
piers7
1
Раньше я часто использовал временные папки и никогда не заботился о том, где они были, пока может происходить очистка, чтобы диск не полностью использовался. Разве это не временная папка для временного использования - ненужный заполнитель? Почему это не может быть неизвестно и обрабатывается API? Вы должны использовать настраиваемое, хорошо известное местоположение вместо temp?
barrypicker

Ответы:

405

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 для вашего пользователя-администратора указывает на путь к Windows, либо они не заданы, и он использует запасной путь к временному пути Windows.

Найл Коннотон
источник
14
TEMPПеременная окружения будет установлена в двух местах: для самого пользователя, так и для локальной машины. Если он не установлен для пользователя, то будет использоваться тот, который используется для локальной машины, и это всегда устанавливается при установке по умолчанию. Поэтому поиск обычно останавливается на втором шаге. При тестировании, если TMP, TEMPи USERPROFILEвсе установлено, что на самом деле делает откат к %SystemRoot%( C:\Windows\).
Боб
1
Код, выполняемый в службах Windows, которые выполняются в «Локальной системе» или в приложениях, запущенных такой службой, папка C: \ Windows \ Temp иногда используется как временная папка.
NineBerry
1
Документация по вашей ссылке гласит: «Возвращенная строка заканчивается обратной косой чертой, например,« C: \ TEMP ». Но их пример на самом деле не заканчивается обратной косой чертой.
dcp
Вам не гарантируется, что у вас будет разрешение на запись по пути, возвращенному этой функцией в вашем приложении. А что если вы попробовали вместо этого IsolatedStorage?
Джон
35

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

System.Environment.GetEnvironmentVariable("TEMP")

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

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

Хелен
источник
34
@ImmortalBlue Потому что это не обязательно временный каталог. Правильный способ получить временный каталог - позвонить System.IO.Path.GetTempPath().
Дэвид Хеффернан
9
Я знаю, что это довольно старо, но я решил оставить записку для любого любопытного: не только это не обязательно временный каталог, как сказал @DavidHeffernan, но вы просто не знаете, что это такое. Хотя это не такая большая проблема с .NET, это считается плохой практикой, потому что любой злонамеренный пользователь мог изменить эту переменную среды, чтобы использовать вашу программу. Если вы работаете с правами администратора и вредоносная программа может изменять ваш код во время его выполнения, они могут, например, выполнять шеллкод в качестве администратора, поскольку он хранится в TEMP.
Срабой
Есть 2 основных различия между GetEnvironmentVariable("TEMP")и GetTempPath(). GetTempPath()сначала проверяется переменная «TMP», затем «TEMP» и, наконец, «USERPROFILE». Если не найти ни одного из них, он возвращает путь к папке Windows. Это также гарантирует, что он возвращает правильный путь, но это не гарантирует, что путь существует.
Логман
Но это именно то, что делает принятый ответ, если у вас нет переменной TMP (сценарий по умолчанию в последних версиях Windows), не так ли?
PRMan
1
GetTempPathв любом случае, если вы читаете документацию по ядру, так что, как указывает пользователь Logman, нет причин не использовать GetEnvironmentVariable... они оба имеют одинаковую слабость.
AnorZaken
22

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

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

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

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

IAbstract
источник
-8

пытаться

Environment.GetEnvironmentVariable("temp");
Ikke
источник