Menggunakan Server.MapPath di kelas C # eksternal di ASP.NET


132

Saya mencoba untuk mendapatkan path absolut dari file tertentu di kelas C #. Server.MapPathbekerja sangat baik tentu saja untuk ASPX dan halaman belakang kode mereka, tetapi itu tidak ada di file kelas lain. Saya mencoba HostingEnvironment.MapPath(), tetapi itu mengeluh bahwa jalur virtual relatif tidak diizinkan. Adakah pikiran?

System.Web sudah diimpor.

Jawaban:


302

The ServerUtilitykelas tersedia sebagai contoh dalam Anda HttpContext. Jika Anda berada di lingkungan di mana Anda tahu itu akan dieksekusi di dalam pipa ASP.Net, Anda bisa menggunakannya

HttpContext.Current.Server.MapPath()

Anda harus mengimpor System.Websekalipun.


1
Meskipun pos ini sudah lebih dari 2 tahun, Anda telah banyak membantu saya. Terima kasih.
iarwain01

6
Bagaimana jika itu tidak dieksekusi dalam pipa itu?
zaitsman

Jika Anda tidak mengeksekusi di dalam ASP.Net maka tidak mungkin HttpContext Anda disetel, kecuali Anda menulis pipeline sendiri :) Anda harus mengandalkan metode apa pun yang disediakan konteks eksekusi (router?) Anda. Jika proses Anda memiliki wawasan tentang dasar-dasar perutean jalur Anda, Anda dapat melihat metode System.IO.Path.
Beranjak

Ini dikompilasi tetapi konteksnya adalah nol di luar controller, jadi kode saya kesalahan. Saya pikir womp mengatakan hal yang sama di sana. Jika demikian, bisakah Anda mengakses MapPath di luar router?
edencorbin

34

Anda juga bisa menggunakan:

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

jika

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

tidak dapat diakses


8

Tidak bisakah Anda menambahkan referensi System.Webdan kemudian Anda dapat menggunakannya Server.MapPath?

Sunting: Saat ini saya akan merekomendasikan menggunakan HostingEnvironment.MapPathMetode :

Ini adalah metode statis dalam System.Webperakitan yang memetakan jalur virtual ke jalur fisik di server. Itu tidak memerlukan referensi HttpContext.


Tidak di kelas eksternal.
funwhilelost

Tentu Anda dapat menambahkan referensi ke kelas eksternal; tetapi jelas Anda perlu menggunakannya dalam konteks permintaan server sehingga HttpContext bukan nol.
Dan Diplo

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

JIKA file yang Anda coba dapatkan adalah lokasi perakitan untuk suatu jenis. Tetapi jika file relatif terhadap lokasi perakitan maka Anda dapat menggunakan ini dengan System.IOnamespace untuk mendapatkan path yang tepat dari file tersebut.


-1: Apa yang membuat Anda percaya bahwa dia menginginkan lokasi sebuah kebaktian?
John Saunders

1
Dia mengatakan "file-file tertentu" dia tidak menentukan lokasi atau sifat dari file, sehingga mengetahui lokasi perakitan dan dapat bekerja relatif terhadap jalur itu dapat membantu. Tentu saja jika dia benar-benar menyatakan dia masih dalam HttpContext maka saya tidak akan repot-repot menjawab.
David McEwing

David McEwing, apa yang Anda sarankan tidak akan berhasil karena IIS tidak memuat rakitan dari lokasi Anda menginstalnya, di situs web. Mereka disalin dan dimuat dari lokasi cache sementara asp.net, sehingga melakukan GetAssembly atau GetExecutingAssembly akan mengarahkan Anda ke lokasi perakitan, tetapi itu tidak ada hubungannya dengan lokasi situs web yang ditunjuk oleh MapPath.
zumalifeguard


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

Sekarang ketika Anda memanggil metode dari codebehind

sebagai contoh :

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

            test.useServerPath(path);
}

dengan cara ini kode Anda sederhana dan dengan satu metode Anda dapat menggunakan beberapa jalur untuk setiap panggilan :)


3

Yang ini membantu saya

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

Selamat datang di stackoverflow. Sedikit penjelasan lebih lanjut akan membantu sesama programmer untuk memahami mengapa solusinya berhasil.
NJInamdar

1

Apakah Anda menjalankan dalam konteks ASP.NET atau tidak, Anda harus dapat menggunakan HostingEnvironment.ApplicationPhysicalPath


0

Server.mappath ("") akan berfungsi pada halaman aspx, jika Anda ingin mendapatkan path absolut dari file kelas Anda harus menggunakan ini-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.