Mein Projekt hat eine Ordnerstruktur wie folgt:
- Projekt,
- Projekt / Daten
- Projekt / Motor
- Projekt / Server
- Projekt / Frontend
Auf dem Server (der im Ordner Projekt / Server ausgeführt wird) verweise ich auf den Ordner wie folgt:
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);
Auf meinem Windows-Computer funktioniert dieser Code Directory.GetCurrentDirectory()
einwandfrei, da er auf den aktuellen Ordner übertragen wurde
rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length);
holt mir den Stammordner des Projekts (nicht die Ordner bin oder debug). Aber als ich es auf einem Mac laufen ließ, wurde es " Directory.GetCurrentDirectory()
" an / usr // [etwas anderes] gesendet. Es bezog sich nicht auf den Ordner, in dem mein Projekt liegt.
Was ist der richtige Weg, um relative Pfade in meinem Projekt zu finden? Wo soll ich den Datenordner so speichern, dass er für alle Unterprojekte in der Lösung leicht zugänglich ist - speziell für das Turmfalken-Server-Projekt? Ich möchte es lieber nicht im Ordner wwwroot speichern müssen, da der Datenordner von einem anderen Mitglied im Team verwaltet wird und ich nur auf die neueste Version zugreifen möchte. Was sind meine Optionen?
quelle
IWebHostEnvironment
implementiertIHostEnvironment
- Referenz -IHostingEnvironment
wurde zurückgezogenAb sofort wird an .Net Core 2.2 und 3.0 gearbeitet.
So rufen Sie das Projektstammverzeichnis in einem Controller ab:
Erstellen Sie eine Eigenschaft für die Hosting-Umgebung
private readonly IHostingEnvironment _hostingEnvironment;
Fügen Sie Ihrem Controller Microsoft.AspNetCore.Hosting hinzu
using Microsoft.AspNetCore.Hosting;
Registrieren Sie den Service im Konstruktor
public HomeController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; }
Nun, um den Stammpfad des Projekts zu erhalten
string projectRootPath = _hostingEnvironment.ContentRootPath;
Verwenden Sie , um den Pfad " wwwroot " abzurufen
quelle
wwwroot
im Projekt vorhanden sind und ob es nicht leer ist.IHostingEvironment
hier mit Abhängigkeitsinjektion injiziert wird, und das ist das Problem.In einigen Fällen
_hostingEnvironment.ContentRootPath
undSystem.IO.Directory.GetCurrentDirectory()
Ziele zum Quellverzeichnis. Hier ist ein Fehler .Die dort vorgeschlagene Lösung hat mir geholfen
quelle
Wie zuvor beantwortet (und zurückgezogen). Verwenden Sie Directory.GetCurrentDirectory () nicht, um das Basisverzeichnis wie am Speicherort der ausgeführten Assembly abzurufen, sondern beziehen Sie es von 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); }
Ich habe jedoch einen zusätzlichen Fehler gemacht: Ich hatte das ContentRoot-Verzeichnis beim Start auf Directory.GetCurrentDirectory () gesetzt, wodurch der von mir gewünschte Standardwert untergraben wurde! Hier habe ich die beleidigende Zeile auskommentiert:
public static void Main(string[] args) { var host = new WebHostBuilder().UseKestrel() // .UseContentRoot(Directory.GetCurrentDirectory()) //<== The mistake .UseIISIntegration() .UseStartup<Program>() .Build(); host.Run(); }
Jetzt läuft es richtig - ich kann jetzt zu Unterordnern meines Projektstamms navigieren mit:
var pathToData = Path.GetFullPath(Path.Combine(projectRootFolder, "data"));
Ich habe meinen Fehler erkannt, indem ich BaseDirectory vs. Current Directory gelesen habe und @CodeNotFound die Antwort gefunden hat (die zurückgezogen wurde, weil sie aufgrund des obigen Fehlers nicht funktioniert hat), die im Grunde hier zu finden ist: Abrufen des WebRoot-Pfads und des Inhaltsstammpfads in Asp.net Ader
quelle
Versuchen Sie hier zu suchen: Der beste Weg, um den Pfad des Anwendungsordners zu erhalten
Um von dort zu zitieren:
quelle
Wenn Sie ASP.NET MVC Core 3 oder höher verwenden,
IHostingEnvironment
wurde es veraltet und durch ersetztIWebHostEnvironment
public Startup(IWebHostEnvironment webHostEnvironment) { var webRootPath = webHostEnvironment.WebRootPath; }
quelle
Ich habe das Problem mit diesem Code gelöst:
using System.IO; var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location.Substring(0, Assembly.GetEntryAssembly().Location.IndexOf("bin\\")))
quelle
Ref: https://stackoverflow.com/a/55602187/932448
quelle
Wenn dies für jemanden in einer Razor Page-Datei cshtml.cs nützlich sein kann, gehen Sie wie folgt vor: Fügen Sie
IHostEnvironment hostEnvironment
dem Konstruktor einen Parameter hinzu, der automatisch eingefügt wird:public class IndexModel : PageModel { private readonly ILogger<IndexModel> _logger; private readonly IHostEnvironment _hostEnvironment; public IndexModel(ILogger<IndexModel> logger, IHostEnvironment hostEnvironment) { _logger = logger; _hostEnvironment = hostEnvironment; // has ContentRootPath property } public void OnGet() { } }
PS:
IHostEnvironment
ist imMicrosoft.Extensions.Hosting
Namespace, inMicrosoft.Extensions.Hosting.Abstractions.dll
... was für ein Durcheinander!quelle