2009-06-03 21 views
335

Actualmente estoy usando siguiente función para obtener la ruta de la carpeta temporal para el usuario actual:Cómo llegar carpeta temporal para el usuario actual

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

En algunas máquinas que me da ruta de la carpeta Temp del usuario actual como:

C: \ Documents and Settings \ administrador \ Configuración local \ temp \

En algunas máquinas me da ruta de la carpeta temporal del sistema como:

C: \ Windows \ Temp

MSDN La documentación también se dice que por encima de API devuelve la carpeta temporal del sistema actual.

¿Hay alguna otra API disponible que me da el camino de usuario actual temporal carpeta de la siguiente manera:

C: \ Documents and Settings \ Administrador \ Configuración local \ Temp \

+2

El comportamiento de System.Environment.GetEnvironmentVariable ("TEMP") es el mismo que GetTempPath(). En mi máquina para 'administrador' de cuenta, ambas API devuelven "C: \ WINDOWS \ TEMP" pero para la cuenta 'Servicio de red' ambas API devuelven "C: \ Documents and Settings \ Network Service \ Local Settings \ Temp \". – Anoop

+1

¿Quizás la cuenta de 'administrador' tiene una carpeta temporal de C: \ Windows \ Temp de hecho? – Helen

+2

¿Hay alguna razón específica por la que desee obtener la ruta temporal en C: \ Documents and Settings \ always? – Noldorin

Respuesta

349

System.IO.Path.GetTempPath() es simplemente un contenedor para una llamada nativa a GetTempPath(..) en Kernel32.

Tenga una mirada en http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Copiado de esa página:

La función comprueba GetTempPath para la existencia de variables de entorno en el siguiente orden y utiliza el primer camino encontrado:

  • La ruta especificada por la variable de entorno TMP.
  • La ruta especificada por la variable de entorno TEMP.
  • La ruta especificada por la variable de entorno USERPROFILE.
  • El directorio de Windows.

No está del todo claro si "El directorio de Windows" significa el directorio temporal en Windows o el directorio de Windows en sí. Volcar los archivos temporales en el directorio de Windows parece ser un caso indeseable, pero quién sabe.

Combinando esa página con su publicación Supongo que cualquiera de las variables TMP, TEMP o USERPROFILE para su usuario de administrador apuntan a la ruta de Windows, o bien no están configuradas y está tomando una alternativa a las ventanas trayectoria de la temperatura

+14

La variable de entorno 'TEMP' se establecerá en dos lugares: para el usuario mismo y para la máquina local. Si no está configurado para el usuario, entonces se usará el de la máquina local, y eso siempre se configura en una instalación predeterminada. Por lo tanto, la búsqueda generalmente se detiene en el segundo paso. En las pruebas, si 'TMP',' TEMP' y 'USERPROFILE' están todos desarmados, en realidad * does * regresa a'% SystemRoot% '(' 'C: \ Windows \' '). – Bob

+1

Código que se ejecuta en Servicios de Windows que se ejecutan en "Sistema local" o en aplicaciones que fueron iniciadas por dicho servicio, la carpeta C: \ Windows \ Temp a veces se usa como carpeta temporal. – NineBerry

-5

tratar

Environment.GetEnvironmentVariable("temp"); 
15

NO usar esto:

System.Environment.GetEnvironmentVariable("TEMP") 

Las variables de entorno pueden anularse, por lo que la variable TEMP no es necesariamente el directorio.

La forma correcta es usar System.IO.Path.GetTempPath() como en la respuesta aceptada.

+32

@ImmortalBlue Porque ese no es necesariamente el directorio temporal. La forma correcta de obtener el directorio temporal es llamar a 'System.IO.Path.GetTempPath()'. –

+6

Sé que esto es bastante viejo, pero pensé que dejaría una nota para alguien curioso: no solo no es necesariamente el directorio temporal, como dijo @DavidHeffernan, sino que simplemente no tienes ni idea de qué se trata. Aunque no es un gran problema con .NET, se considera una práctica deficiente porque cualquier usuario malintencionado podría haber alterado esa variable de entorno para explotar su programa. Si está ejecutando privilegios de administrador y el malware puede alterar su código mientras se está ejecutando, puede, por ejemplo, ejecutar shellcode como administrador porque se ha almacenado en TEMP. – sraboy

+0

Hay 2 diferencias principales entre 'GetEnvironmentVariable (" TEMP ")' y 'GetTempPath()'. 'GetTempPath()' verifica primero la variable "TMP", luego "TEMP" y finalmente "USERPROFILE". Si no encuentra ninguna de esas, devuelve la ruta a la carpeta de Windows. También garantiza que devuelve la ruta correcta, pero no es garantía de que exista una ruta. – Logman

17

Tengo este mismo requisito: queremos colocar registros en un directorio raíz específico que debería existir dentro del entorno.

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

Si quiero combinar esto con un subdirectorio, yo debería ser capaz de utilizar Path.Combine(...).

El método GetFolderPath tiene una sobrecarga de opciones de carpeta especial que le permite controlar si la ruta especificada se crea o simplemente se verifica.

Cuestiones relacionadas