web-dev-qa-db-fra.com

C # obtenant 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 d'où mon application est exécutée:

Impossible de trouver une partie du chemin "D:\Projects\SubVersionProjects\CatDialer\bin\Debug \% AppData%\DateLinks.xml".

Je pensais que le %AppData% devrait trouver le chemin relatif. Quand je vais Start|Run|%AppData% Windows Explorer m'amène à ce répertoire.

Je ne peux pas mettre le chemin complet, car l'utilisateur est différent sur chaque ordinateur client.

356
ant2009

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

_Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
_

(doit ajouter _using System_ s'il n'est pas présent).

_%AppData%_ est une variable d'environnement et elles ne sont pas développées automatiquement dans .NET, bien que vous puissiez utiliser explicitement la méthode Environment.ExpandEnvironmentVariable pour le faire. Je suggérerais néanmoins fortement que vous utilisiez 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");
_
744
Noldorin

Le chemin est différent si vous parlez d'ASP.NET.

Je n'ai trouvé aucune des valeurs 'SpecialFolder' pointant 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 existe un autre moyen plus abstrait de se rendre à App_Data aimerait savoir comment.

48
Simon_Weaver

Le meilleur moyen _ d'utiliser le répertoire AppData, EST à utiliser Environment.ExpandEnvironmentVariable méthode.

Les raisons:

  • il remplace des parties de votre chaîne par des répertoires valides ou quoi que ce soit
  • il est insensible à la casse
  • c'est facile et simple
  • c'est un standard
  • bon pour traiter avec la saisie 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);
_

N'oubliez pas que certains utilisateurs saisissent _%AppData%_, certains _%appdata%_ et certains _%APpData%_. Vous ne voulez pas en arriver à:

_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 EST). D'habitude, je ne dis pas aux gens de pas de réinventer la roue, mais après je suis allé dans l'autre sens et j'ai réalisé que c'était une mauvaise idée.

29
Bitterblue

Vous pouvez aussi utiliser

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

pour développer la variable %AppData%.

22
parapet

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

15
Nathan

Je ne pense pas que mettre% AppData% dans une chaîne comme celle-là fonctionnera.

essayer

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
6
danswain

Je voulais simplement partager un autre moyen d'accéder au dossier 'App_Data' dans mon application mvc au cas où quelqu'un en aurait besoin.

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
4
cpoDesign

Pour ASP.NET, le paramètre Load User Profile doit être défini sur le pool d'applications, mais cela ne suffit pas. Il y a un paramètre caché nommé setProfileEnvironment dans \Windows\System32\inetsrv\Config\applicationHost.config, qui est désactivé pour une raison quelconque par défaut, au lieu d'être activé comme décrit dans la documentation . Vous pouvez modifier la valeur par défaut ou la définir sur votre pool d'applications. Toutes les méthodes de la classe Environment renverront alors les valeurs appropriées.

1
MoonStom

Cela fonctionne pour moi dans une application console -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
1
Bill