¿Cuándo System.getProperty ("java.io.tmpdir") devuelve "c: \ temp"

110

Solo tengo curiosidad por saber cuándo System.getProperty("java.io.tmpdir")regresa "c:\temp". De acuerdo con java.io.File Java Docs -

El directorio de archivos temporales predeterminado lo especifica la propiedad del sistema java.io.tmpdir. En los sistemas UNIX, el valor predeterminado de esta propiedad suele ser "/ tmp" o "/ var / tmp"; en los sistemas Microsoft Windows suele ser "c: \ temp". Se puede dar un valor diferente a esta propiedad del sistema cuando se invoca la máquina virtual Java, pero no se garantiza que los cambios programáticos a esta propiedad tengan ningún efecto sobre el directorio temporal utilizado por este método.

Pero en mi caso

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

Siempre regresa

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

¿En qué condiciones volverá "c:\temp"?

EDITADO: Si cambio% TEMP% a C: \ Temp, obtendré C: \ Temp, ¿verdad? Pero la documentación muestra c: \ Temp en lugar de C: \ Temp.

Ashish Pancholi
fuente
4
en.wikipedia.org/wiki/Temporary_folder Mirando la wiki, yo diría que puede hacerlo C:\Tempcambiando% TEMP%, instalando Windows 98 o pasándolo a java -Djava.io.tmpdir=C:\Temp. También
mira
@Max Gracias MAX. Si cambio% TEMP% a C:\Temp, obtendré C:\Temp. ¿Correcto? pero doc show en c:\Templugar de C:\Temp. :)
Ashish Pancholi
2
No sé por qué la letra de la unidad es importante en su aplicación.
Ajduke
@AshishPancholi ¿no te llevó allí?
ajduke
El Javadoc 1.4.2 al que está enlazando está desactualizado. La corriente 7 Javadoc menciona un directorio "típico" de "C:\\WINNT\\TEMP".
Abdull

Respuestas:

128

En MS Windows, el directorio temporal lo establece la variable de entorno TEMP. En XP, el directorio temporal se estableció por usuario como Configuración local \ Temp.

Si cambia su variable de entorno TEMP a C:\temp, obtendrá lo mismo cuando ejecute:

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

Madhusudan Joshi
fuente
2
En Windows hay una segunda variable de entorno llamada% TMP% y es esta la que se usa a veces, no% TEMP%, por ejemplo, el complemento GWT para Eclipse usa la variable% TMP%.
Wee Shetland
@Joshi: Tu respuesta es bastante precisa. Sin embargo, no estoy de acuerdo con el ejemplo que dio: si el usuario configuró la TMPvar env, TEMPse ignorará. Por favor, consulte mi respuesta y avíseme si no entendió lo que quiero decir.
Zakaria
38

Si pones

-Djava.io.tmpdir=C:\temp
Peter Lawrey
fuente
17
Los nombres de archivo de Windows no distinguen entre mayúsculas y minúsculas.
Peter Lawrey
33

Por un lado, cuando llama a una System.getProperty("java.io.tmpdir")instrucción, Java llama a la función de la API de Win32 GetTempPath. Según MSDN :

La función GetTempPath comprueba la existencia de variables de entorno en el siguiente orden y utiliza la primera ruta encontrada:

  1. La ruta especificada por la variable de entorno TMP.
  2. La ruta especificada por la variable de entorno TEMP.
  3. La ruta especificada por la variable de entorno USERPROFILE.
  4. El directorio de Windows.

Por otro lado, verifique las razones históricas sobre por qué TMPy TEMPconviven . Realmente vale la pena leerlo.

Zakaria
fuente
0

El valor de %TEMP%la variable de entorno es a menudo específico del usuario y Windows lo configura con respecto a la cuenta de usuario actualmente conectada. Algunas cuentas de usuario pueden no tener un perfil de usuario, por ejemplo, cuando su proceso se ejecuta como un servicio en SYSTEM, LOCALSYSTEMu otra cuenta incorporada, o es invocado por la aplicación IIS con la identidad de AppPool con la opción Crear perfil de usuario deshabilitada. Entonces, incluso cuando no sobrescribe la %TEMP%variable explícitamente, Windows puede usar c:\tempo incluso c:\windows\tempcarpetas para, digamos, cuentas de usuario no habituales. Y lo que es más importante, es posible que el proceso no tenga derechos de acceso a este directorio.

Maciek
fuente