ASP.NET'te harici C # Sınıflarında Server.MapPath kullanma


132

Bir C # sınıfındaki belirli dosyaların mutlak yolunu elde etmeye çalışıyorum. Server.MapPathTabii ki ASPX ve arka plan kod sayfaları için harika çalışıyor, ancak bu başka bir sınıf dosyasında mevcut değil. Denedim HostingEnvironment.MapPath()ama bu göreli sanal yola izin verilmediğinden şikayet ediyor. Düşüncesi olan var mı?

System.Web zaten içe aktarıldı.

Yanıtlar:


302

ServerUtilitySınıf Gözlerinde farklı bir örneği olarak kullanılabilir HttpContext. ASP.Net ardışık düzeninde yürütüleceğini bildiğiniz bir ortamdaysanız, şunu kullanabilirsiniz:

HttpContext.Current.Server.MapPath()

System.WebYine de içe aktarmanız gerekecek .


1
Bu gönderi 2 yıldan daha eski olmasına rağmen bana çok yardımcı oldunuz. Teşekkürler.
iarwain01

6
Ya o boru hattında yürütülmezse?
zaitsman

ASP.Net'in içinde çalıştırmıyorsanız, kendi ardışık düzeninizi yazmadığınız sürece HttpContext'in ayarlanması olası değildir :) Yürütme bağlamınızın (yönlendirici?) Sağladığı yöntemlere güvenmeniz gerekecektir. Süreciniz, yol yönlendirmenizin temelleri hakkında bilgi içeriyorsa, System.IO.Path yöntemlerine bir göz atabilirsiniz.
womp

Bu derlendi ancak bağlam denetleyicilerin dışında boş, bu yüzden kod hatalarım. Sanırım womp orada da aynı şeyi söylüyor. Bu durumda, MapPath'e yönlendiricilerin dışından erişebilir misiniz?
edencorbin

34

Ayrıca kullanabilirsiniz:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

Eğer

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

erişilemez


8

Bir referans ekleyip System.Websonra kullanamaz Server.MapPathmısın?

Düzenleme: Bugünlerde HostingEnvironment.MapPathYöntemi kullanmanızı öneririm :

System.WebSunucudaki fiziksel bir yola sanal bir yolu eşleyen montajda statik bir yöntemdir . O değil bir başvuru gerektirir HttpContext.


Dış sınıflarda değil.
funwhilelost

Elbette referansı harici bir sınıfa ekleyebilirsiniz; ancak açıkçası bunu bir sunucu isteği bağlamında kullanmanız gerekir, böylece HttpContext boş değildir.
Dan Diplo

4
System.Reflection.Assembly.GetAssembly(type).Location

EĞER almaya çalıştığınız dosya bir tipin montaj konumu ise. Ancak dosyalar montaj konumuna System.IOgöreyse, dosyanın tam yolunu almak için bunu ad alanıyla birlikte kullanabilirsiniz .


-1: Bir meclisin yerini istediğine inanmanıza ne sebep oldu?
John Saunders

1
Dosyaların konumunu veya yapısını belirtmediğini "belirli dosyalar" dedi, dolayısıyla montaj yerini bilmek ve bu yola göre çalışabilmek faydalı olabilir. Elbette, hala bir HttpContext'te olduğunu söyleseydi, o zaman cevap vermekle uğraşmazdım.
David McEwing

David McEwing, önerdiğiniz şey işe yaramaz çünkü IIS derlemeleri web sitesinde kurduğunuz yerden yüklemiyor. Geçici bir asp.net önbellek konumundan kopyalanır ve yüklenirler, bu nedenle bir GetAssembly veya GetExecutingAssembly yapmak sizi derlemenin konumuna yönlendirir, ancak MapPath'in işaret ettiği web sitesinin konumu ile hiçbir ilgisi yoktur.
zumalifeguard


3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Şimdi, yöntemi koddan çağırdığınızda

Örneğin :

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

bu şekilde kodunuz basittir ve tek bir yöntemle her çağrı için birden fazla yol kullanabilirsiniz :)


3

Bu bana yardımcı oldu

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

Stackoverflow'a hoş geldiniz. Biraz daha açıklama, diğer programcıların çözümün neden işe yaradığını anlamalarına yardımcı olur.
NJInamdar

1

ASP.NET bağlamında çalışıyor olsanız da olmasanız da, HostingEnvironment.ApplicationPhysicalPath'i kullanabilmeniz gerekir.


0

Server.mappath ("") aspx sayfasında çalışacaktır, eğer bir sınıf dosyasından mutlak yolu almak istiyorsanız bunu kullanmanız gerekir-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.