Ce qui détermine la valeur de retour de Chemin.GetTempPath()?
Actuellement, je utiliser Path.GetTempPath()
à comprendre où écrire mon journal de fichiers, mais récemment je suis tombé sur l'ordinateur de l'utilisateur où le chemin retourné n'était pas ce que j'attendais.
Généralement, le renvoi du chemin est C:\Documents and Settings\[nom d'utilisateur]\Local Settings\Temp
mais dans ce cas, il a été C:\Temp
Ce ne serait pas normalement être un problème, mais pour une raison quelconque, l'utilisateur en question n'ont pas accès à l'écriture de C:\Temp
J'ai vérifié les variables d'environnement, et la variable d'environnement UTILISATEUR a été pointée comme prévu à C:\Documents and Settings\[nom d'utilisateur]\Local Settings\Temp, tandis que la variable d'environnement SYSTÈME a été pointant vers C:\WINNT\Temp.
Alors... où est Path.GetTempPath()
obtenir une valeur de ? La Stratégie De Groupe? Registre?
J'ai Googlé, mais en vain.
- +1 Rapide, propre, clair, bonne question - Bienvenue sur StackOverflow
- si vous avez besoin d'un endroit sûr, qui est toujours accessible en écriture pour l'utilisateur, découvrez le stockage isolé: msdn.microsoft.com/en-us/library/bdts8hk0.aspx
- à moins que le mode FIPS est activé, dans ce cas, vous obtenez une exception lors de l'utilisation de IsolatedStorage
- intéressant, merci pour le pointeur. Première fois que j'entends quelque chose comme ça (probablement car ici en Europe, nous n'avons pas vraiment beaucoup de soins au sujet de "FIPS" et autres....)
Vous devez vous connecter pour publier un commentaire.
(À l'aide d'un Réflecteur)
Path.GetTempPath()
en fin de compte des appels de la fonction Win32 GetTempPath (à partir de kernel32.dll). Le MDSN docs pour cet état:Remarque qu'ils affirment également que les elle ne vérifie pas si le chemin existe réellement ou peut être écrit à, de sorte que vous pouvez vous retrouver à essayer d'écrire vos fichiers journaux sur un chemin qui n'existe pas, ou que vous ne peut pas accéder.
Path.GetTempPath()
a très semblable contenu dans les Remarques.Avertissement: n'est Pas une réponse, mais important de le lire !
Il est très important de réaliser que vous avez besoin pour nettoyer vos fichiers temporaires parce que quand vous frappez 65536 dans un répertoire unique, le cadre ne crée pas de plus et que votre application va exploser!
Ils vont s'accumuler au fil des mois et des mois, et ensuite, vous aurez un message comme ceci:
et TFS donnera-vous que lorsque vous essayez de construire:
Tout ce que vous devez faire est de naviguer à la
Path.GetTempPath()
dossier et appeldel tmp*
Remarque: Si vous avez une ASP.NET appliation de la création de fichiers temporaires de son répertoire temp sera probablement différent de l'actuel de l'utilisateur connecté
En cas de doute (ou dans la panique) il suffit de créer une page aspx imprimer l'emplacement utilisé:
Pour moi lors de l'exécution comme
NetworkService
- je obtenirLors de l'exécution d'un pool d'applications (nommé http://www.example.com) le chemin d'accès peut être:
PS. Je pense que cela peut se produire même si vous supprimez le fichier par la suite parce que le nom du fichier augmente.
J'ai remarqué GetTempPath() peut ramener le local de Documents de l'utilisateur & Settings\utilisateur\Local Settings\Temp chemin si c'est une application console, et remarqué qu'il peut ramener C:\WINDOWS\Temp (sur le serveur) si c'est une application web être couru à partir d'un client. Dans le premier cas, pas grand-chose - pour le compte de l'exécution de l'application qui a les droits sur ce dossier. Dans le dernier cas, peut-être que c'est une grosse affaire si l'Application de la Piscine compte de l'Identité du (ou un compte que vous pouvez utiliser pour usurper l'identité avec le Web.fichier de configuration de l'application web) n'ont pas de privilèges pour C:\WINDOWS\Temp sur le serveur (qui est une grande chance qu'il ne fait pas). Donc, pour ma console apps, juste pour qu'il n'y a pas de question où les fichiers temporaires sont des écrits, de coder en dur une chaîne de caractères dans un fichier INI est le meilleur et le plus simple pour moi, et pour une application web, le codage en dur dans le web.config et de le faire à l'aide de ConfigurationManager.AppSettings["maclé"] fonctionne, ou si c'est une application web, utilisez cette fonction pour envoyer le fichier à l'ASP Temporaire de Fichiers de dossiers et de travailler avec elle il y a:
et de l'appeler comme ceci:
et il suffit d'utiliser "chemin_dossier_temp" au lieu de l'endroit où vous avez utilisé le Chemin d'accès.GetTempPath() avant. Cette fonction fonctionne awesome & je l'utilise dans mon code à la place de ce mal GetTempPath() la méthode donc je sais que mon application peut faire ce qu'il doit faire, puisque l'ASP Fichiers temporaires dossier doit disposer de toutes les autorisations dont il a besoin pour ses opérations (DOMAINE\SERVICE RÉSEAU et de l'Application de la Piscine de l'ID de compte besoin de Contrôle). chemin_dossier_temp se termine par un slash de fin, juste concat directement avec votre variable/nom de fichier pour obtenir la bonne voie.
-Tom
P. S. Vous devez ajouter 2 espaces de noms pour faire de cette fonction de travail: Système d'.IO et du Système.La réflexion
Il appelle la GetTempPath fonction. La documentation explique ce que les variables d'environnement qu'il vérifie.
Essayez d'utiliser les éléments suivants pour déterminer la bonne place pour Vos données:
Où Specialfolder
Si vous utilisez
C#
surMacOS
à l'aide deMono Framework
alors la valeur retournée parPath.GetTempPath()
est la valeur de la variable d'environnementTMPDIR
.De course
echo $TMPDIR
généralement retourne la valeur comme :