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.

Chet
sumber

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.

womp
sumber
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

Yakir Manor
sumber
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.

Dan Diplo
sumber
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.

David McEwing
sumber
-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
4

Saya menggunakan ini juga:

System.Web.HTTPContext.Current.Server.MapPath
begitu menakjubkan
sumber
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 :)

Ahmad
sumber
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);
netuser
sumber
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

daudihus
sumber
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")
Debendra Dash
sumber