การใช้ Server.MapPath ในคลาส C # ภายนอกใน ASP.NET


132

ฉันกำลังพยายามหาเส้นทางที่แน่นอนของไฟล์บางไฟล์ในคลาส C # Server.MapPathใช้งานได้ดีสำหรับ ASPX และหน้าโค้ดหลัง แต่ไม่มีอยู่ในไฟล์คลาสอื่น ฉันลองHostingEnvironment.MapPath()แล้ว แต่บ่นว่าไม่อนุญาตเส้นทางเสมือนสัมพัทธ์ ความคิดใด ๆ ?

System.Web นำเข้าแล้ว

คำตอบ:


306

ชั้นสามารถใช้ได้เป็นเช่นในของคุณServerUtility HttpContextหากคุณอยู่ในสภาพแวดล้อมที่คุณรู้ว่าจะถูกดำเนินการภายในไปป์ไลน์ ASP.Net คุณสามารถใช้

HttpContext.Current.Server.MapPath()

คุณจะต้องนำเข้าSystem.Webแม้ว่า


1
แม้ว่าโพสต์นี้จะมีอายุมากกว่า 2 ปีแล้ว แต่คุณได้ช่วยฉันอย่างมาก ขอบคุณ.
iarwain01

6
จะเกิดอะไรขึ้นถ้ามันไม่ถูกดำเนินการในไปป์ไลน์นั้น?
zaitsman

หากคุณไม่ได้ดำเนินการภายใน ASP.Net แสดงว่าไม่น่าเป็นไปได้ที่ HttpContext ของคุณจะถูกตั้งค่าเว้นแต่คุณจะเขียนไปป์ไลน์ของคุณเอง :) คุณจะต้องพึ่งพาวิธีการใดก็ตามที่บริบทการดำเนินการของคุณ (เราเตอร์?) มีให้ หากกระบวนการของคุณมีข้อมูลเชิงลึกเกี่ยวกับพื้นฐานของการกำหนดเส้นทางเส้นทางของคุณคุณสามารถดูวิธี System.IO.Path
womp

สิ่งนี้คอมไพล์แล้ว แต่บริบทเป็นโมฆะนอกตัวควบคุมดังนั้นข้อผิดพลาดรหัสของฉัน ฉันคิดว่า womp กำลังพูดในสิ่งเดียวกันที่นั่น หากเป็นเช่นนั้นคุณสามารถเข้าถึง MapPath นอกเราเตอร์ได้หรือไม่?
edencorbin

34

คุณยังสามารถใช้:

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

ถ้า

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

ไม่สามารถเข้าถึงได้


8

คุณไม่สามารถเพิ่มข้อมูลอ้างอิงSystem.Webแล้วใช้งานได้Server.MapPathหรือไม่?

แก้ไข: ปัจจุบันฉันขอแนะนำให้ใช้HostingEnvironment.MapPathวิธีการ :

เป็นวิธีการแบบคงที่ในSystem.Webแอสเซมบลีที่แมปเส้นทางเสมือนไปยังเส้นทางจริงบนเซิร์ฟเวอร์ มันไม่HttpContextจำเป็นต้องมีการอ้างอิงถึง


ไม่ได้อยู่ในชั้นเรียนภายนอก
fun whilelost

แน่ใจว่าคุณสามารถเพิ่มการอ้างอิงไปยังคลาสภายนอกได้ แต่เห็นได้ชัดว่าคุณต้องใช้ในบริบทของการร้องขอเซิร์ฟเวอร์ดังนั้น HttpContext จึงไม่เป็นโมฆะ
Dan Diplo

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

หากไฟล์ที่คุณพยายามรับเป็นตำแหน่งการประกอบสำหรับประเภท แต่ถ้าไฟล์สัมพันธ์กับตำแหน่งแอสเซมบลีคุณสามารถใช้สิ่งนี้กับSystem.IOเนมสเปซเพื่อรับเส้นทางที่แน่นอนของไฟล์


-1: อะไรทำให้คุณเชื่อว่าเขาต้องการที่ตั้งของการชุมนุม?
John Saunders

1
เขากล่าวว่า "ไฟล์บางไฟล์" เขาไม่ได้ระบุตำแหน่งหรือลักษณะของไฟล์ดังนั้นการรู้ตำแหน่งการประกอบและความสามารถในการทำงานที่สัมพันธ์กับเส้นทางนั้นจะเป็นประโยชน์ แน่นอนว่าถ้าเขาบอกจริง ๆ ว่าเขายังอยู่ใน HttpContext ฉันก็คงไม่ต้องใส่ใจตอบ
David McEwing

David McEwing สิ่งที่คุณแนะนำจะใช้ไม่ได้ผลเพราะ IIS ไม่โหลดแอสเซมบลีจากตำแหน่งที่คุณติดตั้งในเว็บไซต์ พวกเขาถูกคัดลอกและโหลดจากตำแหน่งแคชชั่วคราวของ asp.net ดังนั้นการทำ GetAssembly หรือ GetExecutingAssembly จะนำคุณไปยังตำแหน่งของแอสเซมบลี แต่จะไม่เกี่ยวข้องกับตำแหน่งของเว็บไซต์ที่ MapPath ชี้ไป
zumalifeguard


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

ตอนนี้เมื่อคุณเรียกใช้เมธอดจาก codebehind

ตัวอย่างเช่น :

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

            test.useServerPath(path);
}

ด้วยวิธีนี้รหัสของคุณจะง่ายและด้วยวิธีการเดียวคุณสามารถใช้หลายเส้นทางสำหรับการโทรแต่ละครั้ง :)


3

อันนี้ช่วยสำหรับฉัน

//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 คำอธิบายเพิ่มเติมเล็กน้อยจะช่วยให้เพื่อนโปรแกรมเมอร์เข้าใจว่าเหตุใดวิธีการแก้ปัญหาจึงได้ผล
NJInamdar

1

ไม่ว่าคุณจะทำงานในบริบทของ ASP.NET หรือไม่ก็ตามคุณควรจะสามารถใช้ HostingEnvironment.ApplicationPhysicalPath


0

server.mappath ("") จะทำงานบนเพจ aspx หากคุณต้องการรับพา ธ สัมบูรณ์จากไฟล์คลาสคุณต้องใช้สิ่งนี้ -

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.