68 votes

Qu'est ce qui détermine la valeur de retour de Path.GetTempPath ()?

Actuellement, j'utilise Path.GetTempPath() de savoir 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 chemin est retourné 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() d'obtenir une valeur de ? La Stratégie De Groupe? Registre?

J'ai Googlé, mais en vain.

56voto

adrianbanks Points 36858

(À 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:

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

  • Le chemin d'accès spécifié par la variable d'environnement TMP.
  • Le chemin d'accès spécifié par la variable d'environnement TEMP.
  • Le chemin d'accès spécifié par la variable d'environnement PROFIL_UTILISATEUR.
  • Le répertoire Windows.

Notez qu'ils affirment également qu' il n'a pas à vérifier si oui ou non le chemin d'accès 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.

14voto

Simon_Weaver Points 31141

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:

System.IO.IOException: The file exists.

  at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
  at System.IO.__Error.WinIOError()
  at System.IO.Path.InternalGetTempFileName(Boolean checkHost)
  at System.IO.Path.GetTempFileName():

et TFS donnera-vous que lorsque vous essayez de construire:

TF215097: An error occurred while initializing a build for build 
definition XXXXX: The file exists. 

Tout ce que vous devez faire est de naviguer à l' Path.GetTempPath() le dossier et appelez - del tmp*

Remarque: Si vous avez une ASP.NET appliation de la création de temp fichiers du répertoire temporaire 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

 TempPath.aspx
 <%@ Page Language="C#"%>
 Temp path: <%= System.IO.Path.GetTempPath() %>

Pour moi, lors de l'exécution comme NetworkService - je obtenir

 C:\Windows\TEMP\

2voto

Tom Points 111

J'ai remarqué GetTempPath() peut ramener le local de l'utilisateur Documents & 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 une grosse affaire - 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:

public static string findFileDirectory(string file)
{
    // Get the directory where our service is being run from
    string temppath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    // Ensure proper path notation so we can add the INI file name
    if (!temppath.EndsWith(@"\")) temppath += @"\";

    return temppath;
}

et de l'appeler comme ceci:

    string tempFolderPath = findFileDirectory("Web.config");
    tempFolderPath = tempFolderPath.Replace(@"\\", @"\");

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 est génial et 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

1voto

Arve Points 3665

Il appelle la fonction GetTempPath . La documentation explique quelles variables d'environnement sont vérifiées.

1voto

Turowicz Points 1120

Essayez d’utiliser ce qui suit pour déterminer le bon emplacement pour vos données:

 Environment.GetFolderPath(Environment.SpecialFolder folder);
 

Où Specialfolder

 // Summary:
//     Specifies enumerated constants used to retrieve directory paths to system
//     special folders.
[ComVisible(true)]
public enum SpecialFolder
{
  // Summary:
  //     The logical Desktop rather than the physical file system location.
  Desktop = 0,
  //
  // Summary:
  //     The directory that contains the user's program groups.
  Programs = 2,
  //
  // Summary:
  //     The directory that serves as a common repository for documents.
  Personal = 5,
  //
  // Summary:
  //     The "My Documents" folder.
  MyDocuments = 5,
  //
  // Summary:
  //     The directory that serves as a common repository for the user's favorite
  //     items.
  Favorites = 6,
  //
  // Summary:
  //     The directory that corresponds to the user's Startup program group.
  Startup = 7,
  //
  // Summary:
  //     The directory that contains the user's most recently used documents.
  Recent = 8,
  //
  // Summary:
  //     The directory that contains the Send To menu items.
  SendTo = 9,
  //
  // Summary:
  //     The directory that contains the Start menu items.
  StartMenu = 11,
  //
  // Summary:
  //     The "My Music" folder.
  MyMusic = 13,
  //
  // Summary:
  //     The directory used to physically store file objects on the desktop.
  DesktopDirectory = 16,
  //
  // Summary:
  //     The "My Computer" folder.
  MyComputer = 17,
  //
  // Summary:
  //     The directory that serves as a common repository for document templates.
  Templates = 21,
  //
  // Summary:
  //     The directory that serves as a common repository for application-specific
  //     data for the current roaming user.
  ApplicationData = 26,
  //
  // Summary:
  //     The directory that serves as a common repository for application-specific
  //     data that is used by the current, non-roaming user.
  LocalApplicationData = 28,
  //
  // Summary:
  //     The directory that serves as a common repository for temporary Internet files.
  InternetCache = 32,
  //
  // Summary:
  //     The directory that serves as a common repository for Internet cookies.
  Cookies = 33,
  //
  // Summary:
  //     The directory that serves as a common repository for Internet history items.
  History = 34,
  //
  // Summary:
  //     The directory that serves as a common repository for application-specific
  //     data that is used by all users.
  CommonApplicationData = 35,
  //
  // Summary:
  //     The System directory.
  System = 37,
  //
  // Summary:
  //     The program files directory.
  ProgramFiles = 38,
  //
  // Summary:
  //     The "My Pictures" folder.
  MyPictures = 39,
  //
  // Summary:
  //     The directory for components that are shared across applications.
  CommonProgramFiles = 43,
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X