Mendapatkan direktori saat ini di aplikasi web .NET

105

Jadi saya memiliki proyek web, dan saya mencoba untuk mendapatkan direktori root dari situs web tersebut menggunakan metode c # Directory.GetCurrentDirectory(). Saya tidak ingin menggunakan jalur statis karena lokasi file akan berubah di masa mendatang. Metode ini berjalan di file imageProcess.aspx.cs saya, tetapi di mana saya pikir itu akan kembali:

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

Saya malah mendapatkan:

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

Adakah yang bisa menjelaskan mengapa ini terjadi dan apa solusi yang mungkin? Terima kasih banyak.

Julian Coltea
sumber
Posting terkait di sini yang berbicara tentang jalur eksekusi aplikasi .Net secara umum.
NSP
Posting lain yang berbicara tentang jalur peta server dalam aplikasi web di .Net
RBT

Jawaban:

211

Direktori saat ini adalah fitur tingkat sistem; itu mengembalikan direktori tempat server diluncurkan. Ini tidak ada hubungannya dengan situs web.

Kamu mau HttpRuntime.AppDomainAppPath.

Jika Anda berada dalam permintaan HTTP, Anda juga dapat menelepon Server.MapPath("~/Whatever").

SLaks
sumber
2
Terima kasih. Saya sebenarnya mencari HttpRuntime.BinDirectory, tetapi itu mudah ditentukan di debugger, begitu saya mencoba apa yang Anda sebutkan dalam jawaban Anda.
Kent Weigel
Jika saya menggunakan `Server.MapPath (" ~ Apapun ") dan situs IIS di-host di myserver . Saya mendapatkan folder C: \\ somefolder \ Apapun, daripada folder myserver / Apapun .
Si8
@ Si8: Ya; itulah yang Server.MapPathdilakukannya. Anda ingin stackoverflow.com/q/5823847/34397
SLaks
2
Jika Anda tidak terbiasa dengan rakitan .NET (atau berada di Jendela Segera), perintah lengkapnya adalah System.Web.HttpRuntime.AppDomainAppPathdanSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern
2
@testpattern HttpContextadalah System.Web.HttpContext.Current.Server.MapPath("~"), tidak punyaHttpRuntime
chengzi
112

Gunakan kode ini:

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

Referensi Terperinci:

Server.MapPath menentukan jalur relatif atau virtual untuk dipetakan ke direktori fisik.

  • Server.MapPath(".") mengembalikan direktori fisik saat ini dari file (misalnya aspx) yang sedang dijalankan
  • Server.MapPath("..") mengembalikan direktori induk
  • Server.MapPath("~") mengembalikan jalur fisik ke root aplikasi
  • Server.MapPath("/") mengembalikan jalur fisik ke root nama domain (tidak harus sama dengan root aplikasi)

Sebuah contoh:

Misalkan Anda mengarahkan aplikasi situs web ( http://www.example.com/ ) ke

C:\Inetpub\wwwroot

dan menginstal aplikasi toko Anda (sub web sebagai direktori virtual di IIS, ditandai sebagai aplikasi) di

D:\WebApps\shop

Misalnya, jika Anda memanggil Server.MapPathpermintaan berikut:

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

kemudian:

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

Jika Path dimulai dengan garis miring (/) atau garis miring ke belakang (), MapPathmetode akan mengembalikan jalur seolah-olah Path adalah jalur virtual penuh.

Jika Path tidak dimulai dengan garis miring, MapPathmetode tersebut mengembalikan jalur yang berhubungan dengan direktori permintaan yang sedang diproses.

Catatan: di C #, @ adalah operator string literal verbatim yang berarti bahwa string harus digunakan "sebagaimana adanya" dan tidak diproses untuk escape sequence.

Catatan kaki

Server.MapPath(null)dan Server.MapPath("")akan menghasilkan efek ini juga.

Harshal Doshi Jain
sumber
17
Salinan sempurna stackoverflow.com/questions/275781/…
GGO
3
@GGO Tautan bagus! Mengikuti tautan, saya akhirnya melakukannya System.Web.Hosting.HostingEnvironment.MapPath("~"), yang berfungsi dengan baik, tanpa ketergantungan padaSystem.Web.HttpContext.Current
Max Barraclough