Comment obtenir le répertoire racine du projet dans le kernel asp.net. Directory.GetCurrentDirectory () ne semble pas fonctionner correctement sur un Mac

Mon projet a une structure de dossiers à la hauteur de:

  • Projet,
  • Projet / données
  • Projet / Moteur
  • Projet / serveur
  • projet / front-end

Dans le serveur, je me réfère au dossier comme ceci:

var rootFolder = Directory.GetCurrentDirectory(); rootFolder = rootFolder.Subssortingng(0, rootFolder.IndexOf(@"\Project\", SsortingngComparison.Ordinal) + @"\Project\".Length); PathToData = Path.GetFullPath(Path.Combine(rootFolder, "Data")); var Parser = Parser(); var d = new FileStream(Path.Combine(PathToData, $"{dataFileName}.txt"), FileMode.Open); var fs = new StreamReader(d, Encoding.UTF8); 

Sur mon ordinateur Windows, ce code fonctionne bien puisque Directory.GetCurrentDirectory() référence au dossier actuel et

 rootFolder.Subssortingng(0, rootFolder.IndexOf(@"\Project\", SsortingngComparison.Ordinal) + @"\Project\".Length); 

me donne le dossier racine du projet (pas les dossiers bin ou debug). Mais quand je l’ai exécuté sur un mac, il a reçu ” Directory.GetCurrentDirectory() “, il m’a envoyé vers / usr // [quelque chose d’autre]. Cela ne faisait pas référence au dossier où se trouve mon projet.

Quelle est la bonne façon de trouver des chemins relatifs dans mon projet? Où devrais-je stocker le dossier de données de manière à ce qu’il soit facilement accessible à tous les sous-projets de la solution, en particulier au projet de serveur Kestrel? Je préfère ne pas avoir à le stocker dans le dossier wwwroot car le dossier de données est géré par un autre membre de l’équipe et je souhaite simplement accéder à la dernière version. Quelles sont mes options?

Comme précédemment répondu (et rétracté). Pour obtenir le répertoire de base , comme dans l’emplacement de l’assembly en cours d’exécution, n’utilisez pas Directory.GetCurrentDirectory (), mais plutôt depuis IHostingEnvironment.ContentRootPath.

 private IHostingEnvironment _hostingEnvironment; private ssortingng projectRootFolder; public Program(IHostingEnvironment env) { _hostingEnvironment = env; projectRootFolder = env.ContentRootPath.Subssortingng(0, env.ContentRootPath.LastIndexOf(@"\ProjectRoot\", SsortingngComparison.Ordinal) + @"\ProjectRoot\".Length); } 

Cependant, j’ai commis une erreur supplémentaire: j’avais défini le répertoire ContentRoot sur Directory.GetCurrentDirectory () au démarrage, ce qui nuisait à la valeur par défaut que j’avais tant souhaitée! Ici, j’ai commenté la ligne incriminée:

  public static void Main(ssortingng[] args) { var host = new WebHostBuilder().UseKestrel() // .UseContentRoot(Directory.GetCurrentDirectory()) //<== The mistake .UseIISIntegration() .UseStartup() .Build(); host.Run(); } 

Maintenant, il fonctionne correctement – je peux maintenant naviguer vers les sous-dossiers de la racine de mes projets avec:

 var pathToData = Path.GetFullPath(Path.Combine(projectRootFolder, "data")); 

J’ai compris mon erreur en lisant BaseDirectory vs. Current Directory et @CodeNotFound (), qui a été retiré (parce que cela n’a pas fonctionné à cause de l’erreur ci-dessus). Ce chemin peut être trouvé ici: Obtenir les chemins WebRoot et Content Root dans Asp.net Coeur

Selon votre position dans le pipeline IConfiguration – si vous avez access à IConfiguration ( constructeur Startup.cs ) ou à IHostingEnvironment vous pouvez injecter IHostingEnvironment dans votre constructeur ou simplement demander la clé à la configuration.

Injecter IHostingEnvironment dans le constructeur Startup.cs

 public Startup(IConfiguration configuration, IHostingEnvironment env) { var contentRoot = env.ContentRootPath; } 

Utilisation de IConfiguration dans le constructeur Startup.cs

 public Startup(IConfiguration configuration) { var contentRoot = configuration.GetValue(WebHostDefaults.ContentRootKey); } 

Essayez de chercher ici: meilleur moyen d’obtenir le chemin du dossier de l’application

Pour citer à partir de là:

System.IO.Directory.GetCurrentDirectory() renvoie le répertoire en cours, qui peut être ou non le dossier dans lequel se trouve l’application. Il en va de même pour Environment.CurrentDirectory. Si vous utilisez ceci dans un fichier DLL, il retournera le chemin où le processus est en cours d’exécution (c’est particulièrement vrai dans ASP.NET).

Dans certains cas, _hostingEnvironment.ContentRootPath et System.IO.Directory.GetCurrentDirectory() _hostingEnvironment.ContentRootPath au répertoire source. Voici un bug à ce sujet.

La solution proposée là-bas m’a aidé

 Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);