asp.net core でプロジェクトのルートディレクトリを取得する方法。Directory.GetCurrentDirectory() は Mac では正しく動作しないようです。質問する

asp.net core でプロジェクトのルートディレクトリを取得する方法。Directory.GetCurrentDirectory() は Mac では正しく動作しないようです。質問する

私のプロジェクトのフォルダー構造は次のようになります:

  • プロジェクト、
  • プロジェクト/データ
  • プロジェクト/エンジン
  • プロジェクト/サーバー
  • プロジェクト/フロントエンド

サーバー (Project/Server フォルダーで実行) では、次のようにフォルダーを参照します。

var rootFolder = Directory.GetCurrentDirectory();
rootFolder = rootFolder.Substring(0,
            rootFolder.IndexOf(@"\Project\", StringComparison.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);

私のWindowsマシンでは、このコードはDirectory.GetCurrentDirectory()現在のフォルダを参照し、実行しているので正常に動作します。

rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length); 

プロジェクトのルート フォルダー (bin フォルダーやデバッグ フォルダーではありません) を取得します。ただし、Mac で実行すると、" Directory.GetCurrentDirectory()" によって /usr//[something else] に送られました。プロジェクトがあるフォルダーを参照していませんでした。

プロジェクト内の相対パスを見つける正しい方法は何ですか? ソリューション内のすべてのサブプロジェクト (具体的には、Kestrel サーバー プロジェクト) から簡単にアクセスできるように、データ フォルダーをどこに保存すればよいですか? データ フォルダーはチーム内の別のメンバーによって管理されており、最新バージョンにアクセスしたいだけなので、wwwroot フォルダーに保存する必要はないと思います。どのような選択肢がありますか?

ベストアンサー1

ケストレルパイプラインのどこにいるかによって、IConfigurationStartup.csコンストラクタ) またはIWebHostEnvironment以前はIHostingEnvironmentIWebHostEnvironment) をコンストラクターに挿入するか、構成からキーを要求することができます。

コンストラクタIWebHostEnvironmentに注入するStartup.cs

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

Startup.cs コンストラクターで IConfiguration を使用する

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

おすすめ記事