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 \

Anoop
la source
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.

Niall Connaughton
la source
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.

Hélène
la source
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é.

IAbstract
la source
-8

essayer

Environment.GetEnvironmentVariable("temp");
Ikke
la source