Proyek saya memiliki struktur folder untuk lagu:
Di server (berjalan di Proyek/folder Server) saya merujuk ke folder seperti ini:
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);
Pada mesin windows saya kode ini bekerja dengan baik karena Direktori.GetCurrentDirectory()
dirujuk ke folder saat ini, dan melakukan
rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length);
akan saya root folder proyek (bukan sampah atau folder debug).
Tapi ketika aku berlari di mac itu punya "Direktori.GetCurrentDirectory()
" mengirim saya ke /usr/
Apa cara yang benar untuk menemukan path relatif dalam proyek saya? Dimana saya harus menyimpan data folder dengan cara yang mudah diakses untuk semua sub proyek-proyek di solusi - khusus untuk kestrel server project? Aku lebih memilih untuk tidak punya waktu untuk menyimpannya dalam folder wwwroot karena data folder dijaga oleh anggota yang berbeda dalam tim, dan saya hanya ingin mengakses versi terbaru. Apa pilihan saya?
Tergantung di mana anda berada di kestrel pipa - jika anda memiliki akses ke IConfiguration
(Startup.cs
konstruktor) atau IHostingEnvironment
anda dapat menyuntikkan IHostingEnvironment
ke konstruktor anda atau hanya meminta kunci dari konfigurasi.
IHostingEnvironment
di Startup.cs
Konstruktorpublic Startup(IConfiguration configuration, IHostingEnvironment env)
{
var contentRoot = env.ContentRootPath;
}
public Startup(IConfiguration configuration)
{
var contentRoot = configuration.GetValue<string>(WebHostDefaults.ContentRootKey);
}
Bekerja pada .Net Core 2.2 dan 3.0 sekarang.
Untuk mendapatkan proyek-proyek direktori root hanya Controller:
pribadi readonly IHostingEnvironment _hostingEnvironment;
menggunakan Microsoft.AspNetCore.Hosting;
publik HomeController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; }
string projectRootPath = _hostingEnvironment.ContentRootPath;
Untuk mendapatkan "wwwroot" jalan, menggunakan
_hostingEnvironment.WebRootPath
Seperti yang sebelumnya menjawab (dan ditarik kembali). Untuk mendapatkan dasar direktori, seperti di lokasi berjalan perakitan, don't menggunakan Direktori.GetCurrentDirectory(), melainkan mendapatkannya dari 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);
}
Namun saya membuat kesalahan tambahan: saya telah mengatur ContentRoot Direktori ke Direktori.GetCurrentDirectory() pada startup merusak nilai default yang saya telah begitu diinginkan! Di sini saya komentar yang menyinggung garis:
public static void Main(string[] args)
{
var host = new WebHostBuilder().UseKestrel()
// .UseContentRoot(Directory.GetCurrentDirectory()) //<== The mistake
.UseIISIntegration()
.UseStartup<Program>()
.Build();
host.Run();
}
Sekarang sudah berjalan dengan benar - saya sekarang dapat menavigasi ke sub folder dari proyek-proyek saya root dengan:
var pathToData = Path.GetFullPath(Path.Combine(projectRootFolder, "data"));
Saya menyadari kesalahan saya dengan membaca BaseDirectory vs Direktori Saat ini dan @CodeNotFound mendirikan jawaban (yang ditarik karena itu didn't bekerja karena atas kesalahan) yang pada dasarnya dapat ditemukan di sini: Mendapatkan WebRoot Jalan dan Konten Path Root di Asp.net Inti
Dalam beberapa kasus _hostingEnvironment.ContentRootPath
dan Sistem.IO.Directory.GetCurrentDirectory()
target ke direktori source. Berikut ini adalah bug tentang hal itu.
Solusi yang diusulkan tidak membantu saya
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Coba cari di sini: https://stackoverflow.com/questions/6041332/best-way-to-get-application-folder-path
Mengutip dari sana:
Sistem.IO.Directory.GetCurrentDirectory()
kembali saat ini direktori, yang mungkin atau mungkin tidak menjadi folder di mana aplikasi strategis. Hal yang sama berlaku untuk Lingkungan.CurrentDirectory. Dalam kasus anda menggunakan ini dalam sebuah file DLL, itu akan kembali jalur mana proses yang sedang berjalan (hal ini terutama berlaku di ASP.NET).
Aku memecahkan masalah dengan kode ini:
using System.IO;
var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location.Substring(0, Assembly.GetEntryAssembly().Location.IndexOf("bin\\")))
Jika anda menggunakan ASP.NET Inti MVC 3 atau yang lebih baru, IHostingEnvironment
sudah tidak digunakan lagi dan diganti dengan IWebHostEnvironment
public Startup(IWebHostEnvironment webHostEnvironment)
{
var webRootPath = webHostEnvironment.WebRootPath;
}
tampaknya IHostingEnvironment telah digantikan oleh IHostEnvironment (dan beberapa orang lain). Anda harus mampu untuk mengubah jenis antarmuka di kode anda dan semuanya akan bekerja seperti dulu :-)
Anda dapat menemukan informasi lebih lanjut tentang perubahan di link ini di GitHub https://github.com/aspnet/AspNetCore/issues/7749
EDIT juga Ada tambahan antarmuka yang IWebHostEnvironment dapat digunakan di ASP.NET aplikasi Inti. Ini tersedia di Microsoft.AspNetCore.Hosting namespace.