Come ottenere una cartella temporanea per l'utente corrente


395

Attualmente sto usando la seguente funzione per ottenere il percorso della cartella temporanea per l'utente corrente:

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

Su alcune macchine mi dà il percorso della cartella temporanea dell'utente corrente come:

C: \ Documents and Settings \ amministratore \ Impostazioni locali \ Temp \

Su alcune macchine mi dà il percorso della cartella temp del sistema come:

TEMP \ Windows \: C

La documentazione MSDN afferma inoltre che l'API sopra restituisce la cartella temporanea del sistema corrente.

C'è qualche altra API disponibile che mi dà il percorso della cartella temporanea dell'utente attuale come questo:

C: \ Documents and Settings \ amministratore \ Impostazioni locali \ Temp \


2
Il comportamento di System.Environment.GetEnvironmentVariable ("TEMP") è uguale a GetTempPath (). Nella mia macchina per l'account 'amministratore' entrambe le API restituiscono "C: \ WINDOWS \ TEMP" ma per l'account "Servizio di rete" entrambe le API restituiscono "C: \ Documents and Settings \ Network Service \ Local Settings \ Temp \".
Anoop,

1
Forse l'account 'amministratore' ha una cartella temporanea di C: \ Windows \ Temp davvero?
Helen,

2
Esiste un motivo specifico per cui si desidera ottenere sempre il percorso temporaneo in C: \ Documents and Settings \?
Noldorin,

11
FYI: se non desidera che la cartella di sistema Temp, non (se impostato) l'utente è possibile utilizzare Environment.GetEnvironmentVariable ( "temp", EnvironmentVariableTarget.Machine)
piers7

1
In passato, ho usato le cartelle temporanee frequentemente e non mi è mai importato di dove si trovasse, purché possa avvenire la pulizia in modo che il disco non venga completamente consumato. Il punto di una cartella temporanea non è per uso temporaneo: segnaposto spazzatura? Perché non può essere sconosciuto e gestito dall'API? Dovresti usare una posizione configurabile e ben nota invece di temp?
barrypicker

Risposte:


405

System.IO.Path.GetTempPath()è solo un wrapper per una chiamata nativa GetTempPath(..)in Kernel32.

Dai un'occhiata a http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Copiato da quella pagina:

La funzione GetTempPath verifica l'esistenza delle variabili di ambiente nel seguente ordine e utilizza il primo percorso trovato:

  • Il percorso specificato dalla variabile di ambiente TMP.
  • Il percorso specificato dalla variabile d'ambiente TEMP.
  • Il percorso specificato dalla variabile d'ambiente USERPROFILE.
  • La directory di Windows

Non mi è del tutto chiaro se "La directory di Windows" significhi la directory temporanea in Windows o la directory di Windows stessa. Scaricare i file temporanei nella directory di Windows suona come un caso indesiderato, ma chi lo sa.

Quindi, combinando quella pagina con il tuo post, immagino che una delle variabili TMP, TEMP o USERPROFILE per l'utente Amministratore punta al percorso di Windows, altrimenti non sono impostate e sta eseguendo un fallback al percorso di temp di Windows.


14
La TEMPvariabile d'ambiente verrebbe impostata in due punti: per l'utente stesso e per il computer locale. Se non è impostato per l'utente, verrà utilizzato quello per il computer locale, che è sempre impostato in un'installazione predefinita. Pertanto la ricerca di solito si interrompe al secondo passaggio. In fase di test, se TMP, TEMPe USERPROFILEsono tutti non impostata, in realtà fa di nuovo caduta a %SystemRoot%( C:\Windows\).
Bob,

1
Codice eseguito nei servizi Windows eseguiti in "Sistema locale" o nelle applicazioni avviate da tale servizio, la cartella C: \ Windows \ Temp viene talvolta utilizzata come cartella termporaria.
NineBerry,

1
La documentazione dal tuo link dice questo: "La stringa restituita termina con una barra rovesciata, ad esempio" C: \ TEMP ". Ma il loro esempio in realtà non termina con una barra rovesciata.
DCP

Non si garantisce che si disporrà dell'autorizzazione di scrittura per il percorso restituito da tale funzione nella propria applicazione. E se invece avessi provato IsolatedStorage?
Giovanni,

35

NON usare questo:

System.Environment.GetEnvironmentVariable("TEMP")

Le variabili di ambiente possono essere sovrascritte, quindi la TEMPvariabile non è necessariamente la directory.

Il modo corretto è usare System.IO.Path.GetTempPath()come nella risposta accettata.


34
@ImmortalBlue Perché questa non è necessariamente la directory temporanea. Il modo corretto per ottenere la directory temporanea è chiamare System.IO.Path.GetTempPath().
David Heffernan,

9
So che è piuttosto vecchio ma ho pensato che avrei lasciato un biglietto per chiunque fosse curioso: non solo non è necessariamente la directory temp, come ha detto @DavidHeffernan, ma semplicemente non hai idea di cosa sia. Sebbene non sia un grosso problema con .NET, è considerato una cattiva pratica perché qualsiasi utente malintenzionato potrebbe aver modificato quella variabile di ambiente al fine di sfruttare il programma. Se si esegue con privilegi di amministratore e il malware può modificare il codice durante l'esecuzione, ad esempio, possono eseguire shellcode come amministratore perché è stato archiviato in TEMP.
sraboy

Ci sono 2 differenze principali tra GetEnvironmentVariable("TEMP")e GetTempPath(). GetTempPath()controlla prima la variabile "TMP", quindi "TEMP" e infine "USERPROFILE". Se non trovi nessuno di questi, restituisce il percorso alla cartella Windows. Garantisce inoltre che restituisce il percorso corretto ma non garantisce l'esistenza del percorso.
Logman,

Ma questo è esattamente ciò che fa la risposta accettata se non si dispone di una variabile TMP (scenario predefinito nelle recenti versioni di Windows), non è vero?
PRMan,

1
GetTempPathsi affida comunque alle variabili di ambiente, se leggi la documentazione del kernel, quindi, come sottolinea l'utente Logman, non c'è motivo di non usarlo GetEnvironmentVariable... entrambi hanno la stessa debolezza.
AnorZaken,

22

Ho questo stesso requisito: vogliamo inserire i log in una directory root specifica che dovrebbe esistere all'interno dell'ambiente.

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

Se voglio combinare questo con una sottodirectory, dovrei essere in grado di usare Path.Combine( ... ).

Il GetFolderPathmetodo presenta un sovraccarico per le opzioni di cartelle speciali che consentono di controllare se il percorso specificato deve essere creato o semplicemente verificato.


-8

provare

Environment.GetEnvironmentVariable("temp");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.