1. ホーム
  2. c#

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

2022-11-06 13:01:37

質問内容

私のプロジェクトは、次のようなフォルダ構造になっています。

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

サーバー(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フォルダに格納する必要がないことを希望しています。私のオプションは何ですか?

どのように解決するのですか。

ケストレルパイプラインのどこにいるかにもよりますが、もしあなたが IConfiguration ( Startup.cs コンストラクタ ) または IWebHostEnvironment ( 以前は IHostingEnvironment ) を注入することができます。 IWebHostEnvironment をコンストラクタに注入するか、 あるいは単に設定からキーを要求します。

インジェクト IWebHostEnvironmentStartup.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);
}