Kiedy System.getProperty („java.io.tmpdir”) zwraca „c: \ temp”

110

Ciekawe, kiedy System.getProperty("java.io.tmpdir")wraca "c:\temp". Zgodnie z java.io.File Java Docs -

Domyślny katalog plików tymczasowych jest określony we właściwości systemowej java.io.tmpdir. W systemach UNIX domyślną wartością tej właściwości jest zazwyczaj „/ tmp” lub „/ var / tmp”; w systemach Microsoft Windows jest to zazwyczaj „c: \ temp”. Ta właściwość systemowa może mieć inną wartość, gdy wywoływana jest wirtualna maszyna Java, ale programowe zmiany tej właściwości nie mają żadnego wpływu na katalog tymczasowy używany przez tę metodę.

Ale w moim przypadku-

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

Zawsze wraca

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

W jakich warunkach wróci "c:\temp"?

EDYTOWANE: Jeśli zmienię% TEMP% na C: \ Temp, otrzymam C: \ Temp, prawda? Ale dokumentacja pokazuje c: \ Temp zamiast C: \ Temp.

Ashish Pancholi
źródło
4
pl.wikipedia.org/wiki/Temporary_folder Patrząc na wiki, powiedziałbym, że możesz to zrobić, C:\Tempzmieniając% TEMP%, instalując Windows 98 lub przekazując go do java -Djava.io.tmpdir=C:\Temp. Zobacz także: stackoverflow.com/questions/3437095/…
bezmax
@Max Thanks MAX. Jeśli zmienię% TEMP% na C:\Tempto otrzymam C:\Temp. Dobrze? ale dokument pokaż c:\Tempzamiast C:\Temp. :)
Ashish Pancholi
2
nie wiem, dlaczego litera dysku ma znaczenie w przypadku aplikacji?
ajduke
@AshishPancholi cię tam nie doprowadziło?
ajduke
Dokument Javadoc 1.4.2, do którego tworzysz łącze, jest nieaktualny. Obecny dokument Javadoc 7 wspomina o „typowym” katalogu "C:\\WINNT\\TEMP".
Abdull,

Odpowiedzi:

128

W MS Windows katalog tymczasowy jest ustawiany przez zmienną środowiskową TEMP. W XP katalog tymczasowy został ustawiony dla każdego użytkownika jako Local Settings \ Temp.

Jeśli zmienisz zmienną środowiskową TEMP na C:\temp, otrzymasz to samo po uruchomieniu:

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

Madhusudan Joshi
źródło
2
W systemie Windows istnieje druga zmienna środowiskowa o nazwie% TMP% i to ona jest czasami używana, a nie% TEMP%, na przykład wtyczka GWT dla Eclipse używa zmiennej% TMP%.
Wee Shetland
@Joshi: Twoja odpowiedź jest dość trafna. Jednak nie zgadzam się z podanym przez ciebie przykładem: Jeśli użytkownik ustawi TMPzmienną env, to TEMPzostanie zignorowana. Proszę, zapoznaj się z moją odpowiedzią i daj mi znać, jeśli nie zrozumiałeś, co mam na myśli.
Zakaria
38

Jeśli ustawisz

-Djava.io.tmpdir=C:\temp
Peter Lawrey
źródło
17
W nazwach plików systemu Windows wielkość liter nie jest rozróżniana.
Peter Lawrey
33

Z jednej strony, gdy wywołujesz System.getProperty("java.io.tmpdir")instrukcję, Java wywołuje funkcję Win32 API GetTempPath. Według MSDN :

Funkcja GetTempPath sprawdza istnienie zmiennych środowiskowych w następującej kolejności i używa pierwszej znalezionej ścieżki:

  1. Ścieżka określona przez zmienną środowiskową TMP.
  2. Ścieżka określona przez zmienną środowiskową TEMP.
  3. Ścieżka określona przez zmienną środowiskową USERPROFILE.
  4. Katalog systemu Windows.

Z drugiej strony, sprawdź historyczne powody, dla których istnieją TMPi TEMPwspółistnieją . Naprawdę warto przeczytać.

Zakaria
źródło
0

Wartość %TEMP%zmiennej środowiskowej jest często specyficzna dla użytkownika i system Windows konfiguruje ją z uwzględnieniem aktualnie zalogowanego konta użytkownika. Niektóre konta użytkowników może nie mieć profil użytkownika, na przykład, gdy proces działa jako usługa SYSTEM, LOCALSYSTEMlub inne wbudowane konto, lub jest wywoływana przez aplikację IIS z AppPool identyczności Tworzenie profilu użytkownika opcję wyłączoną. Więc nawet jeśli nie nadpisujesz %TEMP%zmiennej jawnie, system Windows może używać, c:\tempa nawet c:\windows\tempfolderów, powiedzmy, dla niestandardowych kont użytkowników. A co ważniejsze, proces może nie mieć praw dostępu do tego katalogu!

Maciek
źródło