Когда System.getProperty( "java.io.tmpdir" ) возвращает "c:\temp"

Просто интересно, когда System.getProperty("java.io.tmpdir") возвращает "c:\temp". Согласно java.io.File Java Docs -

Каталог временных файлов по умолчанию задается системным свойством java.io.tmpdir. В системах UNIX значение по умолчанию этого свойства обычно равно "/tmp" или "/var/tmp"; в системах Microsoft Windows обычно это "c:\temp". Другое значение может быть присвоено этому системному свойству при вызове виртуальной машины Java, но программные изменения этого свойства не гарантируют никакого влияния на временный каталог, используемый этим методом.

Но в моем случае -

System.out.println(System.getProperty("java.io.tmpdir"));

Всегда возвращает -

C:\Users\admin\AppData\Local\Temp\ i.e. %TEMP%

В каких условиях он вернет "c:\temp"?

EDITED: если я изменю% TEMP% на C:\Temp, тогда я получу C:\Temp, правильно? Но в документации показано c:\Temp вместо C:\Temp.

Ответ 1

В MS Windows временный каталог устанавливается переменной окружения TEMP. В XP временный каталог был настроен для каждого пользователя как локальные настройки \Temp.

Если вы измените переменную среды TEMP на C:\temp, тогда вы получите то же самое при запуске:

System.out.println(System.getProperty("java.io.tmpdir"));

Ответ 2

Если вы установили

-Djava.io.tmpdir=C:\temp

Ответ 3

С одной стороны, когда вы вызываете инструкцию System.getProperty("java.io.tmpdir"), Java вызывает функцию API Win32 GetTempPath. Согласно MSDN:

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

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

С другой стороны, проверьте исторические причины, по которым сосуществуют TMP и TEMP. Это действительно стоит прочитать.

Ответ 4

Значение переменной окружения %TEMP% часто зависит от пользователя, и Windows устанавливает его в отношении текущей учетной записи пользователя. Некоторые учетные записи пользователей могут не иметь профиля пользователя, например, когда ваш процесс выполняется как служба на SYSTEM, LOCALSYSTEM или другой встроенной учетной записи или вызывается приложением IIS с идентификатором AppPool с отключенным параметром Create user profile. Поэтому, даже если вы не перезаписываете переменную %TEMP% явно, Windows может использовать папки c:\temp или даже c:\windows\temp для, скажем, нестандартных учетных записей пользователей. И что более важно, процесс может не иметь прав доступа к этому каталогу!