Projem şu şekilde bir klasör yapısına sahip:
Sunucuda (Proje/Sunucu klasöründe çalışan) klasöre şu şekilde atıfta bulunuyorum:
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 makinemde bu kod Directory.GetCurrentDirectory()
geçerli klasörü ifade ettiği için sorunsuz çalışıyor ve
rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length);
bana projenin kök klasörünü veriyor (bin veya debug klasörlerini değil).
Ancak bir mac üzerinde çalıştırdığımda "Directory.GetCurrentDirectory()
" beni /usr/
Projemdeki göreli yolları bulmanın doğru yolu nedir? Veri klasörünü, çözümdeki tüm alt projelerin - özellikle kestrel sunucu projesinin - kolayca erişebileceği şekilde nerede saklamalıyım? wwwroot klasöründe saklamak zorunda kalmamayı tercih ediyorum çünkü veri klasörü ekipteki farklı bir üye tarafından tutuluyor ve ben sadece en son sürüme erişmek istiyorum. Seçeneklerim nelerdir?
Kestrel boru hattında nerede olduğunuza bağlı olarak - eğer IConfiguration
(Startup.cs
kurucusu) veya IHostingEnvironment
erişiminiz varsa, IHostingEnvironment
kurucunuza enjekte edebilir veya sadece yapılandırmadan anahtarı talep edebilirsiniz.
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);
}
Daha önce yanıtlandığı (ve geri çekildiği) gibi. Çalışan derlemenin konumunda olduğu gibi temel dizini almak için Directory.GetCurrentDirectory() kullanmayın, bunun yerine IHostingEnvironment.ContentRootPath'den alın.
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);
}
Ancak ek bir hata daha yaptım: ContentRoot Dizinini başlangıçta Directory.GetCurrentDirectory() olarak ayarlamıştım ve çok istediğim varsayılan değeri baltalamıştım! Burada hatalı satırı yorumladım:
public static void Main(string[] args)
{
var host = new WebHostBuilder().UseKestrel()
// .UseContentRoot(Directory.GetCurrentDirectory()) //<== The mistake
.UseIISIntegration()
.UseStartup<Program>()
.Build();
host.Run();
}
Şimdi doğru çalışıyor - artık projelerimin kök dizinindeki alt klasörlere şu şekilde gidebiliyorum:
var pathToData = Path.GetFullPath(Path.Combine(projectRootFolder, "data"));
BaseDirectory vs. Current Directory]1 ve @CodeNotFound'un bulduğu (yukarıdaki hata nedeniyle çalışmadığı için geri çekilen) ve temel olarak burada bulabileceğiniz cevabı okuyarak hatamı fark ettim: Asp.net Core'da WebRoot Yolu ve İçerik Kök Yolu Alma
Buraya bakmayı deneyin: https://stackoverflow.com/questions/6041332/best-way-to-get-application-folder-path
Oradan alıntı yapmak gerekirse:
System.IO.Directory.GetCurrentDirectory()
geçerli dizini döndürür dizini, uygulamanın bulunduğu klasör olabilir veya olmayabilir bulunur. Aynı şey Environment.CurrentDirectory için de geçerlidir. Bu durumda bunu bir DLL dosyasında kullanıyorsanız, DLL dosyasının bulunduğu yerin yolunu döndürecektir. işlemi çalışıyor (bu özellikle ASP.NET'te geçerlidir).