私のプロジェクトは、以下のようなフォルダ構造になっています。
サーバー(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やdebugフォルダではありません)。
しかし、Macで実行すると、"Directory.GetCurrentDirectory()
"が表示され、/usr/
プロジェクトの相対パスを見つけるには、どのような方法がありますか?ソリューション内のすべてのサブプロジェクト(特にkestrel serverプロジェクト)から簡単にアクセスできるように、データフォルダをどこに保存すればよいでしょうか?データフォルダはチーム内の別のメンバーが管理しており、私は最新バージョンにアクセスしたいので、wwwrootフォルダに保存する必要はないと考えています。どのような方法がありますか?
もし、IConfiguration
(Startup.cs
コンストラクタ) や IHostingEnvironment
にアクセスできるのであれば、IHostingEnvironment
をコンストラクタに注入するか、コンフィギュレーションからキーを要求することができます。
IHostingEnvironment
in Startup.cs
Constructorpublic Startup(IConfiguration configuration, IHostingEnvironment env)
{
var contentRoot = env.ContentRootPath;
}
public Startup(IConfiguration configuration)
{
var contentRoot = configuration.GetValue<string>(WebHostDefaults.ContentRootKey);
}
以前に回答したとおりです(そして撤回しました)。ベース*ディレクトリ、つまり実行中のアセンブリの場所を取得するには、Directory.GetCurrentDirectory()を使用せず、IHostingEnvironment.ContentRootPathから取得してください。
private IHostingEnvironment _hostingEnvironment;
private string projectRootFolder;
public Program(IHostingEnvironment env)
{
_hostingEnvironment = env;
projectRootFolder = env.ContentRootPath.Substring(0,
env.ContentRootPath.LastIndexOf(@"\ProjectRoot\", StringComparison.Ordinal) + @"\ProjectRoot\".Length);
}
しかし、さらにエラーが発生しました。起動時にContentRoot DirectoryをDirectory.GetCurrentDirectory()に設定してしまい、せっかくのデフォルト値が台無しになってしまいました。 ここで、問題のある行をコメントアウトしました。
public static void Main(string[] args)
{
var host = new WebHostBuilder().UseKestrel()
// .UseContentRoot(Directory.GetCurrentDirectory()) //<== The mistake
.UseIISIntegration()
.UseStartup<Program>()
.Build();
host.Run();
}
これで正常に動作するようになり、プロジェクトルートのサブフォルダに次のように移動できるようになりました。
var pathToData = Path.GetFullPath(Path.Combine(projectRootFolder, "data"));
BaseDirectory vs. Current Directory]1と@CodeNotFoundが見つけた回答(上記のミスで動かなかったので撤回されました)を読んで自分のミスに気付きました。Asp.net CoreでWebRootパスとContent Rootパスを取得する。
こちらをご覧ください: https://stackoverflow.com/questions/6041332/best-way-to-get-application-folder-path
そこから引用すると
System.IO.Directory.GetCurrentDirectory()
はカレントディレクトリを返します。 アプリケーションがあるフォルダであるかどうかに関わらず、カレントディレクトリを返します。 を返します。Environment.CurrentDirectoryについても同様です。因みに DLLファイルで使用している場合、プロセスが実行されている場所のパスが返されます。 プロセスが実行されている場所のパスを返します(特にASP.NETの場合)。