Коли 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"?

ЗМІНЕНО: Якщо я поміняю% 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 Дякую MAX. Якщо я поміняю% TEMP% на C:\Tempтоді я отримаю C:\Temp. Правильно? але док-шоу c:\Tempзамість C:\Temp. :)
Ашиш Панчолі

2
я не знаю, чому літера диска має значення у вашій заяві?
айдуке

@AshishPancholi не потрапив ти туди?
айдуке

1.4.2 Javadoc, з яким ви посилаєтесь, застарів. Поточні 7 Javadoc згадує "типовий" каталог "C:\\WINNT\\TEMP".
Абдулл

Відповіді:


128

У MS Windows тимчасовий каталог встановлюється змінною середовища TEMP. У XP тимчасовий каталог було встановлено для користувача як локальні налаштування \ темп.

Якщо ви зміните змінну середовища TEMP на C:\temp, ви отримаєте те ж саме, коли запустите:

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


2
У Windows існує друга змінна середовище, яка називається% TMP%, і саме вона іноді використовується, а не% TEMP%, наприклад, плагін GWT для Eclipse використовує змінну% TMP%.
Віт Шетланд

@Joshi: Ваша відповідь досить точна. Однак я не погоджуюся з прикладом, який ви наводили: Якщо користувач встановив TMPenv var, тоді заміна TEMPбуде проігнорована. Будь ласка, зверніться до моєї відповіді і повідомте мені, якщо ви не зрозуміли, що я маю на увазі.
Закарія


33

З одного боку, під час виклику System.getProperty("java.io.tmpdir")інструкцій, Java викликає функцію API Win32 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папки для, скажімо, незвичайних облікових записів користувачів. І що ще важливіше, процес може не мати прав доступу до цього каталогу!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.