Comment obtenir un dossier temporaire pour l'utilisateur actuel


395

Actuellement, j'utilise la fonction suivante pour obtenir le chemin du dossier temporaire pour l'utilisateur actuel:

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

Sur certaines machines, il me donne le chemin du dossier temporaire de l'utilisateur actuel comme:

C: \ Documents and Settings \ administrateur \ Local Settings \ Temp \

Sur certaines machines, il me donne le chemin du dossier temporaire du système comme:

C: \ Windows \ TEMP

La documentation MSDN indique également que l'API ci-dessus renvoie le dossier temporaire du système actuel.

Existe-t-il une autre API qui me donne le chemin du dossier temporaire de l'utilisateur actuel comme ceci:

C: \ Documents and Settings \ administrateur \ Local Settings \ Temp \


2
Le comportement de System.Environment.GetEnvironmentVariable ("TEMP") est identique à GetTempPath (). Dans ma machine pour le compte «administrateur», les deux API renvoient «C: \ WINDOWS \ TEMP» mais pour le compte «Service réseau», les deux API renvoient «C: \ Documents and Settings \ Network Service \ Local Settings \ Temp \».
Anoop

1
Peut-être que le compte «administrateur» a un dossier temporaire de C: \ Windows \ Temp en effet?
Helen

2
Y a-t-il une raison particulière pour laquelle vous souhaitez toujours obtenir le chemin temporaire sous C: \ Documents and Settings \?
Noldorin

11
Pour votre information: si vous ne voulez que le dossier temporaire du système, et non (si activé) de l'utilisateur , vous pouvez utiliser Environment.GetEnvironmentVariable ( « temp », EnvironmentVariableTarget.Machine)
piers7

1
Dans le passé, j'ai utilisé des dossiers temporaires fréquemment et je ne me suis jamais soucié de l'endroit où il se trouvait, tant que le nettoyage peut avoir lieu afin que le disque ne soit pas totalement consommé. Le but d'un dossier temporaire n'est-il pas à usage temporaire - espace réservé indésirable? Pourquoi ne peut-il pas être inconnu et géré par l'API? Devriez-vous utiliser un emplacement configurable et bien connu au lieu de temp?
barrypicker

Réponses:


405

System.IO.Path.GetTempPath()est juste un wrapper pour un appel natif à GetTempPath(..)Kernel32.

Jetez un œil à http://msdn.microsoft.com/en-us/library/aa364992(VS.85).aspx

Copié de cette page:

La fonction GetTempPath vérifie l'existence de variables d'environnement dans l'ordre suivant et utilise le premier chemin trouvé:

  • Chemin spécifié par la variable d'environnement TMP.
  • Chemin spécifié par la variable d'environnement TEMP.
  • Chemin spécifié par la variable d'environnement USERPROFILE.
  • Le répertoire Windows.

Il n'est pas tout à fait clair pour moi si "le répertoire Windows" signifie le répertoire temporaire sous Windows ou le répertoire Windows lui-même. Le vidage des fichiers temporaires dans le répertoire Windows lui-même ressemble à un cas indésirable, mais qui sait.

Donc, en combinant cette page avec votre message, je suppose que l'une des variables TMP, TEMP ou USERPROFILE pour votre utilisateur Administrateur pointe vers le chemin Windows, sinon elles ne sont pas définies et cela prend un repli sur le chemin Temp Windows.


14
La TEMPvariable d'environnement serait définie à deux endroits: pour l'utilisateur lui-même et pour la machine locale. S'il n'est pas défini pour l'utilisateur, celui de la machine locale sera utilisé, et il est toujours défini dans une installation par défaut. Par conséquent, la recherche s'arrête généralement à la deuxième étape. Lors du test, si TMP, TEMPet USERPROFILEsont tous hors service, il fait fait retour à l'automne à %SystemRoot%( C:\Windows\).
Bob

1
Code exécuté dans les services Windows qui s'exécutent sous "Système local" ou dans les applications démarrées par un tel service, le dossier C: \ Windows \ Temp est parfois utilisé comme dossier temporaire.
NineBerry

1
La documentation de votre lien dit ceci: "La chaîne retournée se termine par une barre oblique inverse, par exemple," C: \ TEMP ". Mais leur exemple ne se termine pas réellement par une barre oblique inverse.
dcp

Vous n'êtes pas assuré d'avoir la permission d'écrire sur le chemin renvoyé par cette fonction dans votre application. Et si vous essayiez plutôt IsolatedStorage?
John

35

NE PAS utiliser ceci:

System.Environment.GetEnvironmentVariable("TEMP")

Les variables d'environnement peuvent être remplacées, donc la TEMPvariable n'est pas nécessairement le répertoire.

La bonne façon est d'utiliser System.IO.Path.GetTempPath()comme dans la réponse acceptée.


34
@ImmortalBlue Parce que ce n'est pas nécessairement le répertoire temporaire. La bonne façon d'obtenir le répertoire temporaire est d'appeler System.IO.Path.GetTempPath().
David Heffernan

9
Je sais que c'est assez vieux mais je pensais que je laisserais une note pour toute personne curieuse: non seulement ce n'est pas nécessairement le répertoire temporaire, comme l'a dit @DavidHeffernan, mais vous n'avez tout simplement aucune idée de ce que c'est. Bien qu'il ne s'agisse pas autant d'un problème avec .NET, il est considéré comme une mauvaise pratique car tout utilisateur malveillant aurait pu modifier cette variable d'environnement afin d'exploiter votre programme. Si vous utilisez des privilèges d'administrateur et que le logiciel malveillant peut modifier votre code lors de son exécution, il peut, par exemple, exécuter le shellcode en tant qu'administrateur car il a été stocké dans TEMP.
sraboy

Il existe 2 différences principales entre GetEnvironmentVariable("TEMP")et GetTempPath(). GetTempPath()vérifie d'abord la variable "TMP" puis "TEMP" et enfin "USERPROFILE". Si ne trouve aucun de ceux-ci, son chemin de retour vers le dossier Windows. Il garantit également qu'il renvoie un chemin correct, mais il ne garantit pas que le chemin existe.
Logman

Mais c'est exactement ce que fait la réponse acceptée si vous n'avez pas de variable TMP (scénario par défaut sur les versions récentes de Windows), n'est-ce pas?
PRMan

1
GetTempPaths'appuie de toute façon sur vos variables d'environnement, si vous lisez la documentation du noyau, de sorte que l'utilisateur Logman souligne qu'il n'y a aucune raison de ne pas les utiliser GetEnvironmentVariable... ils ont tous les deux la même faiblesse.
AnorZaken

22

J'ai cette même exigence - nous voulons mettre les journaux dans un répertoire racine spécifique qui devrait exister dans l'environnement.

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

Si je veux combiner cela avec un sous-répertoire, je devrais pouvoir l'utiliser Path.Combine( ... ).

La GetFolderPathméthode a une surcharge pour les options de dossier spéciales qui vous permet de contrôler si le chemin spécifié doit être créé ou simplement vérifié.


-8

essayer

Environment.GetEnvironmentVariable("temp");
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.