Quando System.getProperty (“java.io.tmpdir”) retorna “c: \ temp”

110

Apenas curioso para System.getProperty("java.io.tmpdir")saber quando voltará "c:\temp". De acordo com o java.io.File Java Docs -

O diretório de arquivo temporário padrão é especificado pela propriedade do sistema java.io.tmpdir. Em sistemas UNIX, o valor padrão desta propriedade é geralmente "/ tmp" ou "/ var / tmp"; em sistemas Microsoft Windows, normalmente é "c: \ temp". Um valor diferente pode ser fornecido a esta propriedade do sistema quando a máquina virtual Java é chamada, mas as mudanças programáticas nesta propriedade não têm garantia de nenhum efeito sobre o diretório temporário usado por este método.

Mas no meu caso-

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

Sempre retorna-

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

Em que condições ele retornará "c:\temp"?

EDITADO: Se eu alterar% TEMP% para C: \ Temp, obterei C: \ Temp, certo? Mas a documentação mostra c: \ Temp em vez de C: \ Temp.

Ashish Pancholi
fonte
4
en.wikipedia.org/wiki/Temporary_folder Olhando para o wiki, eu diria que você pode fazer isso C:\Tempalterando% TEMP%, instalando o Windows 98 ou passando para java -Djava.io.tmpdir=C:\Temp. Verifique também: stackoverflow.com/questions/3437095/…
bezmax
@Max Obrigado MAX. Se eu alterar% TEMP% para C:\Tempentão, irei obter C:\Temp. Certo? mas doc mostra em c:\Tempvez de C:\Temp. :)
Ashish Pancholi
2
Não sei por que a letra da unidade é importante para o seu aplicativo.
ajduke
@AshishPancholi não te levou lá?
ajduke
O Javadoc 1.4.2 para o qual você está se vinculando está desatualizado. O atual 7 Javadoc menciona um diretório "típico" de "C:\\WINNT\\TEMP".
Abdull

Respostas:

128

No MS Windows, o diretório temporário é definido pela variável de ambiente TEMP. No XP, o diretório temporário era definido por usuário como Configurações locais \ Temp.

Se você alterar sua variável de ambiente TEMP para C:\temp, obterá o mesmo ao executar:

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

Madhusudan Joshi
fonte
2
No Windows, há uma segunda variável de ambiente chamada% TMP% e é ela que às vezes é usada, não% TEMP%, por exemplo, o plugin GWT para Eclipse usa a variável% TMP%.
Wee Shetland
@Joshi: Sua resposta é bastante precisa. No entanto, não concordo com o exemplo que você deu: Se o usuário definir o TMPenv var, o TEMPserá ignorado. Por favor, consulte minha resposta e deixe-me saber se você não entendeu o que quero dizer.
Zakaria
38

Se você definir

-Djava.io.tmpdir=C:\temp
Peter Lawrey
fonte
17
Os nomes de arquivo do Windows não diferenciam maiúsculas de minúsculas.
Peter Lawrey
33

Por um lado, quando você chama a System.getProperty("java.io.tmpdir")instrução, Java chama a função da API do Win32 GetTempPath. De acordo com o MSDN :

A função GetTempPath verifica a existência de variáveis ​​de ambiente na seguinte ordem e usa o primeiro caminho encontrado:

  1. O caminho especificado pela variável de ambiente TMP.
  2. O caminho especificado pela variável de ambiente TEMP.
  3. O caminho especificado pela variável de ambiente USERPROFILE.
  4. O diretório do Windows.

Por outro lado, verifique as razões históricas sobre o porquê TMPe TEMPcoexistem . Vale muito a pena ler.

Zakaria
fonte
0

O valor da %TEMP%variável de ambiente geralmente é específico do usuário e o Windows o configura em relação à conta do usuário conectado no momento. Algumas contas de usuário não pode ter nenhum perfil de usuário, por exemplo, quando as corridas processo como um serviço on SYSTEM, LOCALSYSTEMou outra conta interna, ou é chamado pelo aplicativo IIS com a identidade AppPool com perfil de usuário Criar opção desabilitada. Portanto, mesmo quando você não sobrescreve a %TEMP%variável explicitamente, o Windows pode usar c:\tempou até mesmo c:\windows\temppastas para, digamos, contas de usuário incomuns. E o que é mais importante, o processo pode não ter direitos de acesso a este diretório!

Maciek
fonte