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

110

Просто любопытно, когда 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.

Ашиш Панчоли
источник
4
en.wikipedia.org/wiki/Temporary_folder Глядя на вики, я бы сказал, что вы можете сделать это C:\Temp, изменив% TEMP%, установив Windows 98 или передав его java -Djava.io.tmpdir=C:\Temp. Также проверьте это: stackoverflow.com/questions/3437095/…
bezmax
@Max Спасибо, МАКС. Если я изменю% TEMP% на, C:\Tempто получу C:\Temp. Правильно? но док-шоу c:\Tempвместо C:\Temp. :)
Ашиш Панчоли
2
я не знаю, почему буква диска имеет значение для вашего приложения?
ajduke
@AshishPancholi тебя туда не доставил?
ajduke
Документ Javadoc 1.4.2, на который вы ссылаетесь, устарел. В текущих 7 документах Javadoc упоминается «типичный» каталог файлов "C:\\WINNT\\TEMP".
Абдул

Ответы:

128

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

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

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

Мадхусудан Джоши
источник
2
В Windows есть вторая переменная среды, называемая% TMP%, и она иногда используется, а не% TEMP%, например, плагин GWT для Eclipse использует переменную% TMP%.
Wee Shetland
@Joshi: Ваш ответ довольно точен. Однако я не согласен с приведенным вами примером: если пользователь установил TMPenv var, то TEMPбудет проигнорировано. Пожалуйста, обратитесь к моему ответу и дайте мне знать, если вы не поняли, что я имею в виду.
Zakaria
38

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

-Djava.io.tmpdir=C:\temp
Питер Лоури
источник
17
Имена файлов Windows не чувствительны к регистру.
Питер Лоури
33

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

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

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

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

Закария
источник
0

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

Maciek
источник