C # obtenant le chemin de% AppData%

387

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 à partir duquel mon application s'exécute:

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 j'y vais Start|Run|%AppData%, l'explorateur Windows m'amène dans ce répertoire.

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

ant2009
la source

Réponses:

802

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(doit être ajouté using Systems'il n'est pas présent).

%AppData%est une variable d'environnement et elles ne sont pas développées automatiquement n'importe où dans .NET, bien que vous puissiez explicitement utiliser la Environment.ExpandEnvironmentVariableméthode pour le faire. Je suggérerais néanmoins fortement que vous l' GetFolderPathutilisiez, car comme le souligne Johannes Rössel dans le commentaire, il se %AppData%peut qu'il ne soit pas défini dans certaines circonstances.

Enfin, pour créer le chemin d'accès comme indiqué dans votre exemple:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
Noldorin
la source
45
+1 pour avoir proposé une vraie solution, sans dépendre de l'environnement. Pour ajouter à la réponse: toutes les fonctions qui gèrent les noms de fichiers ne développent pas les variables d'environnement. En fait, vous devez généralement le faire explicitement, sinon cela ne fonctionne pas et vous vous retrouverez avec les dossiers% something%. De plus, l'environnement n'a pas besoin d'être présent, dans certains cas lors de l'exécution d'un programme sous un autre compte utilisateur, l'environnement de l'utilisateur ne sera pas chargé et% Appdata% sera vide. C'est pourquoi vous voudriez utiliser les API documentées pour obtenir ces dossiers (à moins que vous n'utilisiez des fichiers batch, cependant).
Joey
@Johannes: Bonne info là-bas. Je viens de modifier ma réponse lorsque vous avez posté cela, mais je vais préciser que GetFolderPath est certainement préférable à ExpandEnvironmentVariable.
Noldorin
+1 pour Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), j'étais derrière cela depuis quelques jours maintenant.
Sumit Ghosh
1
Pour une raison quelconque, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)renvoie une chaîne vide pour moi (IIS 7, VS 2011). Problème résolu en utilisant la solution Simon_Weaver - cartographie en utilisant MapPath.
Mike Keskinov
52
FYI qui donne le répertoire Roaming pour le local AppData Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)
roundcrisis
49

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

Je n'ai trouvé aucune des valeurs «SpecialFolder» qui pointaient 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 une autre façon plus «abstraite» d'arriver, App_Dataj'aimerais savoir comment.

Simon_Weaver
la source
Juste une note puisque le noyau asp.net sort maintenant. Cette approche repose spécifiquement sur IIS.
George Mauer du
7
HostingEnvironment.MapPath(@"~/App_Data")est meilleur et fonctionne dans les contextes MVC / WebAPI et WCF où il n'y a pas de HttpContext - mais pas sûr du noyau '
Simon_Weaver
37

La meilleure façon d'utiliser le répertoire AppData, IS à utiliser la Environment.ExpandEnvironmentVariableméthode.

Les raisons:

  • il remplace des parties de votre chaîne par des répertoires valides ou autre
  • il est insensible à la casse
  • c'est facile et simple
  • c'est une norme
  • bon pour gérer les entrées des utilisateurs

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 certains %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 de votre faute (d'ailleurs quand elle EST ). Je ne dis généralement pas aux gens de ne pas 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.

Bleu amer
la source
J'ai aimé vos exemples de pathvariable :)
RBT
+1 Environment.ExpandEnvironmentVariableest préférable lorsque vous avez simplement besoin de développer quelle que soit la variable env qui peut se trouver dans la chaîne de chemin.
blins
24

Vous pouvez aussi utiliser

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

pour développer la %AppData%variable.

parapet
la source
15

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

Nathan
la source
20
Il s'agit uniquement de Winforms.
7

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

essayer

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
danswain
la source
4

Je voulais juste partager une autre façon 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")
cpoDesign
la source
Ce n'est peut-être pas la bonne réponse, mais c'est ce que je cherchais. +1
Derrick
A fonctionné pour moi après avoir remplacé les guillemets simples par des guillemets doubles. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data")
ajaysinghdav10d
1

Cela fonctionne pour moi dans une application console -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
Facture
la source
1

Pour ASP.NET, le Load User Profileparamètre doit être défini sur le pool d'applications, mais cela ne suffit pas. Il y a un paramètre caché nommé setProfileEnvironmentdans \Windows\System32\inetsrv\Config\applicationHost.config, ce qui pour une raison quelconque est désactivée par défaut, plutôt que sur la manière décrite dans la documentation . Vous pouvez modifier la valeur par défaut ou la définir dans votre pool d'applications. Toutes les méthodes de la Environmentclasse renverront alors les valeurs appropriées.

MoonStom
la source