477 votes

C# obtient le chemin de %AppData%.

C# 2008 SP1

J'utilise le code ci-dessous :

dt.ReadXml("%AppData%\\DateLinks.xml");

Cependant, je reçois une exception qui pointe vers l'emplacement de l'endroit où mon application est exécutée :

Could not find a part of the path 'D:\Projects\SubVersionProjects\CatDialer\bin\Debug\%AppData%\DateLinks.xml'.

Je pensais que %AppData% devait trouver le chemin relatif. Lorsque je vais dans 'Démarrer|Exécuter|%AppData%, l'explorateur Windows me conduit à ce répertoire.

Je ne peux pas indiquer le chemin complet, car l'utilisateur est différent sur chaque machine cliente.

Merci beaucoup pour tout conseil,

980voto

Noldorin Points 67794

Pour obtenir le AppData il est préférable d'utiliser le répertoire GetFolderPath méthode :

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

%AppData% est une variable d'environnement, et ils ne sont pas automatiquement étendus dans .NET, bien que vous puissiez explicitement utiliser l'attribut Environment.ExpandEnvironmentVariable méthode pour le faire. Je vous conseille néanmoins vivement d'utiliser GetFolderPath cependant, car comme le souligne Johannes Rössel dans le commentaire, %AppData% peut ne pas être défini dans certaines circonstances.

Enfin, pour créer le chemin comme indiqué dans votre exemple :

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml")

80voto

Bitterblue Points 1652

Le site BEST d'utiliser le répertoire AppData, IS à utiliser Environment.ExpandEnvironmentVariable méthode.

Raisons :

  • il remplace des parties de votre chaîne par des répertoires valides ou autre chose.
  • il est insensible à la casse
  • c'est facile et sans complication
  • il s'agit d'une norme
  • bon pour traiter les entrées de l'utilisateur

Exemples :

string path;
path = "%AppData%\stuff";
path = "%aPpdAtA%\HelloWorld";
path = "%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

Rappelez-vous que certains utilisateurs tapent %AppData% , certains %appdata% et quelques %APpData% Vous ne voulez pas vous retrouver avec :

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

Si la variable d'environnement n'est pas définie, ce n'est pas votre faute (à part quand elle IS ). En général, je ne dis pas aux gens de pas réinventer la roue mais après avoir fait le chemin inverse et réalisé que c'était une mauvaise idée.

51voto

Simon_Weaver Points 31141

Le chemin est différent si l'on parle d'ASP.NET.

Je n'ai trouvé aucune valeur de "SpecialFolder" qui pointe vers /App_Data pour ASP.NET.

Au lieu de cela, vous devez faire ceci :

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")

(Remarque : vous n'avez pas besoin de la propriété "Current" dans un contrôleur MVC).

S'il y a un autre moyen plus "abstrait" de se rendre à l'adresse suivante App_Data J'aimerais savoir comment.

28voto

parapet Points 1251

Vous pouvez également utiliser

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

pour développer le %AppData% variable.

16voto

Nathan Reed Points 3192

En .net2.0, vous pouvez utiliser la variable Application.UserAppDataPath

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