How to get root directory of project in asp.net core. Directory.GetCurrentDirectory() doesn't seem to work correctly on a mac
My project has a folder structure to the tune of:
- Project,
- Project/data
- Project/Engine
- Project/Server
- project/front-end
In the server (running in the Project/Server folder) I refer to the folder like this:
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);
On my windows machine this code works fine since Directory.GetCurrentDirectory()
reffered to the current folder, and doing
rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length);
gets me the root folder of the project (not the bin or debug folders).
But when I ran it on a mac it got "Directory.GetCurrentDirectory()
" sent me to /usr//[something else]. It didn't refer to the folder where my project lies.
What is the correct way to find relative paths in my project? Where should I store the data folder in a way that it is easily accessible to all the sub projects in the solution - specifically to the kestrel server project? I prefer to not have to store it in the wwwroot folder because the data folder is maintained by a different member in the team, and I just want to access the latest version. What are my options?
Solution 1:
Depending on where you are in the kestrel pipeline - if you have access to IConfiguration
(Startup.cs
constructor) or IWebHostEnvironment
(formerly IHostingEnvironment
) you can either inject the IWebHostEnvironment
into your constructor or just request the key from the configuration.
Inject IWebHostEnvironment
in Startup.cs
Constructor
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
var contentRoot = env.ContentRootPath;
}
Using IConfiguration in Startup.cs Constructor
public Startup(IConfiguration configuration)
{
var contentRoot = configuration.GetValue<string>(WebHostDefaults.ContentRootKey);
}
Solution 2:
Working on .Net Core 2.2 and 3.0 as of now.
To get the projects root directory within a Controller:
-
Create a property for the hosting environment
private readonly IHostingEnvironment _hostingEnvironment;
-
Add Microsoft.AspNetCore.Hosting to your controller
using Microsoft.AspNetCore.Hosting;
-
Register the service in the constructor
public HomeController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; }
-
Now, to get the projects root path
string projectRootPath = _hostingEnvironment.ContentRootPath;
To get the "wwwroot" path, use
_hostingEnvironment.WebRootPath