การรับไดเร็กทอรีปัจจุบันในเว็บแอปพลิเคชัน. NET


106

Directory.GetCurrentDirectory()ดังนั้นผมจึงมีโครงการเว็บและฉันพยายามที่จะได้รับไดเรกทอรีรากของเว็บไซต์ที่ใช้วิธีการ C # ฉันไม่ต้องการใช้เส้นทางแบบคงที่เนื่องจากตำแหน่งไฟล์จะเปลี่ยนไปในอนาคต วิธีนี้กำลังทำงานในไฟล์ imageProcess.aspx.cs ของฉัน แต่ที่ฉันคิดว่ามันจะกลับมา:

C:\Users\tcbl\documents\visual studio 2010\Projects\ModelMonitoring\ModelMonitoring\imageProcess.aspx.cs

ฉันแทนที่จะได้รับ:

C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\

ใครสามารถอธิบายได้ว่าทำไมสิ่งนี้จึงเกิดขึ้นและทางออกที่เป็นไปได้คืออะไร? ขอบคุณมาก.


โพสต์ที่เกี่ยวข้องที่นี่ซึ่งพูดถึงเส้นทางการเรียกใช้แอปพลิเคชัน. Net โดยทั่วไป
RBT

คำตอบ:


212

ไดเร็กทอรีปัจจุบันเป็นคุณลักษณะระดับระบบ จะส่งคืนไดเร็กทอรีที่เซิร์ฟเวอร์ถูกเรียกใช้ มันไม่มีส่วนเกี่ยวข้องกับเว็บไซต์

HttpRuntime.AppDomainAppPathคุณต้องการ

หากคุณอยู่ในคำขอ HTTP คุณสามารถโทรServer.MapPath("~/Whatever")ได้


2
ขอบคุณ. ฉันกำลังมองหาอยู่HttpRuntime.BinDirectoryแต่นั่นเป็นเรื่องง่ายที่จะตรวจสอบในดีบักเกอร์เมื่อฉันลองสิ่งที่คุณพูดถึงในคำตอบของคุณ
Kent Weigel

หากฉันใช้ `Server.MapPath ( "~ สิ่งที่") และเว็บไซต์ของ IIS จะเป็นเจ้าภาพในmyserver ฉันได้รับ C: \\ somefolder \ Whatever แทนที่จะเป็นโฟลเดอร์myserver / Whatever
Si8

@ Si8: ครับ; นั่นคือสิ่งที่Server.MapPathทำ คุณต้องการstackoverflow.com/q/5823847/34397
SLaks

2
ในกรณีที่คุณไม่คุ้นเคยกับแอสเซมบลี. NET (หรืออยู่ใน Immediate Window) คำสั่งแบบเต็มคือSystem.Web.HttpRuntime.AppDomainAppPathและSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern

2
@testpattern HttpContextคือ System.Web.HttpContext.Current.Server.MapPath("~")ไม่มีHttpRuntime
chengzi

112

ใช้รหัสนี้:

 HttpContext.Current.Server.MapPath("~")

ข้อมูลอ้างอิงโดยละเอียด:

Server.MapPath ระบุพา ธ สัมพัทธ์หรือเสมือนเพื่อแม็พกับฟิสิคัลไดเร็กทอรี

  • Server.MapPath(".") ส่งคืนไดเร็กทอรีฟิสิคัลปัจจุบันของไฟล์ (เช่น aspx) ที่กำลังดำเนินการ
  • Server.MapPath("..") ส่งคืนไดเร็กทอรีหลัก
  • Server.MapPath("~") ส่งคืนเส้นทางฟิสิคัลไปยังรูทของแอ็พพลิเคชัน
  • Server.MapPath("/") ส่งคืนเส้นทางจริงไปยังรากของชื่อโดเมน (ไม่จำเป็นต้องเหมือนกับรูทของแอปพลิเคชัน)

ตัวอย่าง:

สมมติว่าคุณชี้แอปพลิเคชันเว็บไซต์ ( http://www.example.com/ ) ไปที่

C:\Inetpub\wwwroot

และติดตั้งแอปพลิเคชันร้านค้าของคุณ (เว็บย่อยเป็นไดเรกทอรีเสมือนใน IIS ซึ่งทำเครื่องหมายว่าเป็นแอปพลิเคชัน) ใน

D:\WebApps\shop

ตัวอย่างเช่นหากคุณโทรServer.MapPathตามคำขอต่อไปนี้:

http://www.example.com/shop/products/GetProduct.aspx?id=2342

แล้ว:

Server.MapPath(".") returns D:\WebApps\shop\products
Server.MapPath("..") returns D:\WebApps\shop
Server.MapPath("~") returns D:\WebApps\shop
Server.MapPath("/") returns C:\Inetpub\wwwroot
Server.MapPath("/shop") returns D:\WebApps\shop

ถ้า Path เริ่มต้นด้วยเครื่องหมายทับ (/) หรือ backward slash () MapPathเมธอดจะส่งคืนพา ธ ราวกับว่า Path เป็นพา ธ เสมือนแบบเต็ม

ถ้า Path ไม่ได้ขึ้นต้นด้วยเครื่องหมายทับMapPathเมธอดจะส่งคืนพา ธ ที่สัมพันธ์กับไดเร็กทอรีของคำร้องขอที่กำลังประมวลผล

หมายเหตุ: ใน C #, @ คือตัวดำเนินการสตริงตามตัวอักษรแบบคำต่อคำซึ่งหมายความว่าควรใช้สตริง "ตามสภาพ" และไม่ได้รับการประมวลผลสำหรับลำดับ Escape

เชิงอรรถ

Server.MapPath(null)และServer.MapPath("")จะสร้างเอฟเฟกต์นี้ด้วย


17
สำเนาที่สมบูรณ์แบบของstackoverflow.com/questions/275781/…
GGO

3
@GGO ลิงค์ดีๆ! ตามลิงค์ฉันลงเอยด้วยการทำSystem.Web.Hosting.HostingEnvironment.MapPath("~")แทนซึ่งได้ผลดีโดยไม่ต้องพึ่งพาSystem.Web.HttpContext.Current
Max Barraclough
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.