Использование Server.MapPath во внешних классах C # в ASP.NET


132

Я пытаюсь получить абсолютный путь к определенным файлам в классе C #. Server.MapPathконечно отлично работает для ASPX и их страниц кода программной части, но этого не существует в другом файле класса. Я пробовал HostingEnvironment.MapPath(), но жалуется, что относительный виртуальный путь не разрешен. Есть предположения?

System.Web уже импортирован.

Ответы:


302

ServerUtilityКласс доступен как экземпляр в вашем HttpContext. Если вы находитесь в среде, где, как вы знаете, он будет выполняться внутри конвейера ASP.Net, вы можете использовать

HttpContext.Current.Server.MapPath()

Однако вам придется импортировать System.Web.


1
Несмотря на то, что этому посту более двух лет, вы очень мне помогли. Спасибо.
iarwain01

6
Что, если он не выполняется в этом конвейере?
зайцман 05

Если вы не выполняете внутри ASP.Net, то маловероятно, что ваш HttpContext установлен, если только вы не написали свой собственный конвейер :) Вам придется полагаться на любые методы, которые предоставляет ваш контекст выполнения (маршрутизатор?). Если в вашем процессе есть понимание основ маршрутизации вашего пути, вы можете взглянуть на методы System.IO.Path.
womp 05

Это скомпилировано, но контекст имеет значение null за пределами контроллеров, поэтому мой код ошибки. Думаю, 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.


Не во внешних классах.
funfullylost

Конечно, вы можете добавить ссылку на внешний класс; но, очевидно, вам нужно использовать его в контексте запроса сервера, поэтому HttpContext не равен нулю.
Дэн Дипло

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

ЕСЛИ файл, который вы пытаетесь получить, является местом сборки для типа. Но если файлы относятся к месту сборки, вы можете использовать это с System.IOпространством имен, чтобы получить точный путь к файлу.


-1: Что заставило вас поверить в то, что ему нужно было место собрания?
Джон Сондерс

1
Он сказал, что «определенные файлы», он не указал расположение или характер файлов, поэтому знание места сборки и возможность работы относительно этого пути может быть полезным. Конечно, если бы он на самом деле заявил, что все еще находится в HttpContext, я бы не стал отвечать.
Дэвид Макьюинг,

Дэвид Макьюинг, то, что вы предлагаете, не сработает, потому что 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
{
\\.....
}
}

Теперь, когда вы вызываете метод из выделенного кода

например :

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")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.