Como obter uma pasta temporária para o usuário atual

395

Atualmente, estou usando a seguinte função para obter o caminho da pasta temporária para o usuário atual:

string tempPath = System.IO.Path.GetTempPath();

Em algumas máquinas, ele me fornece o caminho da pasta temporária do usuário atual, como:

C: \ Documents and Settings \ administrador \ Configurações locais \ Temp \

Em algumas máquinas, ele fornece o caminho da pasta temp do sistema, como:

C: \ Windows \ TEMP

A documentação do MSDN também diz que a API acima retorna a pasta temporária do sistema atual.

Existe alguma outra API disponível que me dê o caminho da pasta temporária do usuário atual como este:

C: \ Documents and Settings \ administrador \ Configurações locais \ Temp \

Anoop
fonte
2
O comportamento de System.Environment.GetEnvironmentVariable ("TEMP") é o mesmo que GetTempPath (). Na minha máquina, para a conta 'administrador', ambas as API retornam "C: \ WINDOWS \ TEMP", mas para a conta 'Serviço de Rede', ambas as API retornam "C: \ Documentos e Configurações \ Serviço de Rede \ Configurações Locais \ Temp \".
Anoop
11
Talvez a conta 'administrador' possua uma pasta temporária de C: \ Windows \ Temp, de fato?
Helen
2
Existe algum motivo específico pelo qual você deseja obter o caminho temporário em C: \ Documents and Settings \ always?
Noldorin
11
FYI: se você não deseja que a pasta temp do sistema, e não do usuário (se configurada) você pode usar Environment.GetEnvironmentVariable ( "temp", EnvironmentVariableTarget.Machine)
piers7
11
No passado, eu usava pastas temporárias com frequência e nunca me importava onde estava, desde que a limpeza ocorra para que o disco não seja totalmente consumido. O ponto de uma pasta temporária não é para uso temporário - espaço reservado não solicitado? Por que não pode ser desconhecido e tratado pela API? Você deve usar um local configurável e conhecido em vez de temp?
barrypicker

Respostas:

405

System.IO.Path.GetTempPath()é apenas um invólucro para uma chamada nativa GetTempPath(..)no Kernel32.

Dê uma olhada em http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Copiado dessa página:

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

  • O caminho especificado pela variável de ambiente TMP.
  • O caminho especificado pela variável de ambiente TEMP.
  • O caminho especificado pela variável de ambiente USERPROFILE.
  • O diretório do Windows.

Não está totalmente claro para mim se "O diretório do Windows" significa o diretório temporário no Windows ou o próprio diretório do Windows. Despejar arquivos temporários no próprio diretório do Windows parece um caso indesejável, mas quem sabe.

Então, combinando essa página com a sua postagem, eu acho que uma das variáveis ​​TMP, TEMP ou USERPROFILE para o usuário Administrador aponta para o caminho do Windows, ou elas não estão definidas e estão dando um retorno ao caminho temporário do Windows.

Niall Connaughton
fonte
14
A TEMPvariável de ambiente seria configurada em dois locais: para o próprio usuário e para a máquina local. Se não estiver definido para o usuário, será utilizado o da máquina local e sempre configurado em uma instalação padrão. Portanto, a pesquisa geralmente pára na segunda etapa. Nos testes, se TMP, TEMPe USERPROFILEsão todos definida, ele realmente faz para trás queda de %SystemRoot%( C:\Windows\).
22413 Bob
11
Código executado nos Serviços do Windows que são executados em "Sistema Local" ou em aplicativos iniciados por esse serviço, a pasta C: \ Windows \ Temp às vezes é usada como pasta termporary.
NineBerry 02/02
11
A documentação do seu link diz o seguinte: "A string retornada termina com uma barra invertida, por exemplo," C: \ TEMP ". Mas o exemplo deles na verdade não termina com uma barra invertida.
dcp
Você não tem garantia de que terá permissão de gravação para o caminho retornado por essa função em seu aplicativo. E se você tentasse o IsolatedStorage?
John
35

NÃO use isso:

System.Environment.GetEnvironmentVariable("TEMP")

As variáveis ​​de ambiente podem ser substituídas, portanto, a TEMPvariável não é necessariamente o diretório.

A maneira correta é usar System.IO.Path.GetTempPath()como na resposta aceita.

Helen
fonte
34
@ImmortalBlue Porque esse não é necessariamente o diretório temporário. A maneira correta de obter o diretório temporário é chamar System.IO.Path.GetTempPath().
David Heffernan
9
Sei que isso é bastante antigo, mas achei que deixaria um recado para qualquer pessoa curiosa: não só não é necessariamente o diretório temporário, como @DavidHeffernan disse, mas você simplesmente não tem idéia do que é. Embora não seja tão problemático com o .NET, é considerado uma prática ruim porque qualquer usuário mal-intencionado pode ter alterado essa variável de ambiente para explorar seu programa. Se você estiver executando com privilégios de administrador e o malware puder alterar seu código durante a execução, eles podem, por exemplo, executar o código de shell como administrador porque foi armazenado no TEMP.
sraboy
Existem 2 principais diferenças entre GetEnvironmentVariable("TEMP")e GetTempPath(). GetTempPath()verifica primeiro a variável "TMP", depois "TEMP" e, finalmente, "USERPROFILE". Se não encontrar nenhum desses, retorne o caminho para a pasta do Windows. Também garante que ele retorne o caminho correto, mas não garante que o caminho exista.
Logman
Mas é exatamente isso que a resposta aceita faz se você não tiver uma variável TMP (cenário padrão nas versões recentes do Windows), não é?
PRMan
11
GetTempPathdepende de suas variáveis ​​de ambiente de qualquer maneira, se você ler a documentação do kernel, assim como o usuário Logman aponta que não há razão para não usar GetEnvironmentVariable... ambos têm a mesma fraqueza.
AnorZaken
22

Eu tenho esse mesmo requisito - queremos colocar os logs em um diretório raiz específico que deve existir no ambiente.

public static readonly string DefaultLogFilePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

Se eu quiser combinar isso com um subdiretório, devo poder usá-lo Path.Combine( ... ).

O GetFolderPathmétodo possui uma sobrecarga para opções especiais de pasta, que permitem controlar se o caminho especificado será criado ou simplesmente verificado.

IAbstract
fonte
-8

tentar

Environment.GetEnvironmentVariable("temp");
Ikke
fonte