Cómo obtener una carpeta temporal para el usuario actual

395

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

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

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

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

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

C: \ Windows \ TEMP

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

¿Hay alguna otra API disponible que me dé la ruta de la carpeta temporal del usuario actual como esta:

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

Anoop
fuente
2
El comportamiento de System.Environment.GetEnvironmentVariable ("TEMP") es el mismo que GetTempPath (). En mi máquina para la cuenta 'administrador', 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?
Helen
2
¿Hay alguna razón específica por la que desea obtener la ruta temporal en C: \ Documents and Settings \ siempre?
Noldorin
11
FYI: si no desea que la carpeta temporal del sistema, no del usuario (juego si) se puede utilizar Environment.GetEnvironmentVariable ( "temp", EnvironmentVariableTarget.Machine)
piers7
1
En el pasado, usé carpetas temporales con frecuencia y nunca me importó dónde estaba, siempre y cuando la limpieza pueda realizarse para que el disco no se consuma por completo. ¿No es el objetivo de una carpeta temporal para uso temporal - marcador de posición basura? ¿Por qué no puede ser desconocido y manejado por la API? ¿Debería usar una ubicación configurable y bien conocida en lugar de temp?
barrypicker

Respuestas:

405

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

Mira esto http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Copiado de esa página:

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

  • 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 me queda del todo claro si "El directorio de Windows" significa el directorio temporal en Windows o el directorio de Windows en sí. Volcar archivos temporales en el directorio de Windows en sí parece un caso no deseado, pero quién sabe.

Entonces, combinando esa página con su publicación, supongo que una de las variables TMP, TEMP o USERPROFILE para su usuario Administrador apunta a la ruta de Windows, o de lo contrario no están configuradas y está tomando una alternativa a la ruta temporal de Windows.

Niall Connaughton
fuente
14
La TEMPvariable de entorno se establecería en dos lugares: para el propio usuario y para la máquina local. Si no está configurado para el usuario, entonces se usaría 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 la prueba, si TMP, TEMPy USERPROFILEson todos desarmado, lo que realmente hace volver a la caída %SystemRoot%( C:\Windows\).
Bob
1
El código que se ejecuta en los Servicios de Windows que se ejecutan en "Sistema local" o en aplicaciones que se iniciaron con dicho servicio, la carpeta C: \ Windows \ Temp a veces se usa como carpeta temporal.
NineBerry
1
La documentación de su enlace dice esto: "La cadena devuelta termina con una barra invertida, por ejemplo," C: \ TEMP ". Pero su ejemplo en realidad no termina con una barra invertida.
dcp
No se garantiza que tendrá permiso de escritura para la ruta devuelta por esa función en su aplicación. ¿Qué pasa si probaste IsolatedStorage en su lugar?
John
35

NO use esto:

System.Environment.GetEnvironmentVariable("TEMP")

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

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

Helen
fuente
34
@ImmortalBlue Porque ese no es necesariamente el directorio temporal. La forma correcta de obtener el directorio temporal es llamar System.IO.Path.GetTempPath().
David Heffernan
99
Sé que esto es bastante antiguo, pero pensé que dejaría una nota para cualquier persona curiosa: no solo no es necesariamente el directorio temporal, como dijo @DavidHeffernan, sino que simplemente no tienes idea de qué es. Si bien no es un gran problema con .NET, se considera una mala práctica porque cualquier usuario malintencionado podría haber alterado esa variable de entorno para explotar su programa. Si está ejecutando con privilegios de administrador y el malware puede alterar su código mientras se está ejecutando, pueden, por ejemplo, ejecutar shellcode como administrador porque se ha almacenado en TEMP.
sraboy
Hay 2 diferencias principales entre GetEnvironmentVariable("TEMP")y GetTempPath(). GetTempPath()comprueba primero la variable "TMP", luego "TEMP" y finalmente "USERPROFILE". Si no encuentra ninguno de ellos, devuelve la ruta a la carpeta de Windows. También garantiza que devuelve la ruta correcta, pero no garantiza que la ruta exista.
Logman
Pero esto es exactamente lo que hace la respuesta aceptada si no tiene una variable TMP (escenario predeterminado en las versiones recientes de Windows), ¿no?
PRMan
1
GetTempPathDe todos modos, depende de las variables de entorno, si lee la documentación del núcleo, por lo que el usuario Logman señala que no hay razón para no usar GetEnvironmentVariable... ambos tienen la misma debilidad.
AnorZaken
22

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, debería poder usar Path.Combine( ... ) .

El GetFolderPathmétodo tiene una sobrecarga para las opciones especiales de carpeta que le permite controlar si la ruta especificada se crea o simplemente se verifica.

IAbstracto
fuente
-8

tratar

Environment.GetEnvironmentVariable("temp");
Ikke
fuente