web-dev-qa-db-fra.com

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

Actuellement, j'utilise Path.GetTempPath() pour savoir où écrire mes fichiers journaux, mais récemment je suis tombé sur la machine d'un utilisateur où le chemin renvoyé n'était pas celui que j'attendais.

Habituellement, le chemin renvoyé est C:\Documents and Settings\[userid]\Local Settings\Temp mais dans ce cas, c'était C:\Temp

Ce ne serait normalement pas un problème, mais pour une raison quelconque, l'utilisateur en question n'a pas eu accès à l'écriture C:\Temp

J'ai revérifié les variables d'environnement, et la variable d'environnement USER pointait comme prévu vers C:\Documents and Settings\[userid]\Local Settings\Temp, tandis que la variable d'environnement SYSTEM pointait vers - C:\WINNT\Temp.

Alors ... où Path.GetTempPath() obtient-elle sa valeur? Stratégie de groupe? Enregistrement?

J'ai googlé, mais en vain.

65
Andy Blackman

(Utilisation de Reflector) Path.GetTempPath() appelle finalement la fonction Win32 GetTempPath (à partir de kernel32.dll). Les documents MDSN pour cet état:

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.

Notez qu'ils indiquent également que il ne vérifie pas si le chemin existe réellement ou s'il peut être écrit dans , vous pouvez donc finir par essayer d'écrire vos fichiers journaux vers un chemin d'accès qui n'existe pas ou auquel vous ne pouvez pas accéder.

53
adrianbanks

J'ai remarqué que GetTempPath () peut ramener le chemin Documents & Settings\user\Local Settings\Temp de l'utilisateur local s'il s'agit d'une application console, et j'ai remarqué qu'il peut ramener C:\WINDOWS\Temp (sur le serveur) s'il s'agit d'un application Web exécutée à partir d'un client. Dans le premier cas, ce n'est pas grave - le compte exécutant l'application a les droits sur ce dossier. Dans ce dernier, c'est peut-être un gros problème si le compte d'identité du pool d'applications (ou le compte que vous utilisez pour emprunter l'identité dans le fichier Web.config pour l'application Web) n'a pas les privilèges C:\WINDOWS\Temp sur le serveur (ce qui est une grande chance qu'il ne le fasse pas). Donc, pour mes applications de console, juste pour qu'il ne soit pas question où les fichiers temporaires sont écrits, coder en dur une chaîne dans un fichier INI est le meilleur et le plus facile pour moi, et pour une application web, dur -le coder dans le web.config et l'obtenir à l'aide de ConfigurationManager.AppSettings ["myKey"] fonctionne, ou s'il s'agit d'une application web, utilisez cette fonction pour envoyer le fichier aux fichiers temporaires ASP dossiers et travailler avec là-bas:

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 appelez-le comme ceci:

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

et utilisez simplement "tempFolderPath" au lieu de l'endroit où vous avez utilisé Path.GetTempPath () auparavant. Cette fonction fonctionne à merveille et je l'utilise dans mon code à la place de cette mauvaise méthode GetTempPath (), donc je sais que mon application peut faire ce qu'elle doit faire, car le dossier ASP Temp Files devrait avoir toutes les autorisations dont il a besoin pour ses opérations (DOMAIN\NETWORK SERVICE et App Pool ID account ont besoin d'un contrôle total). tempFolderPath se termine par une barre oblique de fin, alors concattez directement avec votre nom de variable/fichier pour obtenir le bon chemin.

-À M

P.S. Vous devez ajouter 2 espaces de noms pour que cette fonction fonctionne: System.IO et System.Reflection

2
Tom

Si vous utilisez C# Sur MacOS en utilisant Mono Framework, La valeur renvoyée par Path.GetTempPath() est la valeur de la variable d'environnement TMPDIR.

L'exécution de echo $TMPDIR Renvoie généralement une valeur comme:

/var/folders/{2 character random-string}/{random-string}/T
1
doer_uvc

Il appelle la fonction GetTempPath . La documentation explique quelles variables d'environnement elle vérifie.

1
Arve

Veuillez essayer ce qui suit pour déterminer le bon emplacement pour vos données:

Environment.GetFolderPath(Environment.SpecialFolder folder);

Où dossier spécial

// 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,
}
1
Wojtek Turowicz