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

132

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

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

Chet
источник

Ответы:

302

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

HttpContext.Current.Server.MapPath()

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

WOMP
источник
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
4

Я тоже этим пользуюсь:

System.Web.HTTPContext.Current.Server.MapPath
soamazing
источник
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);
}

таким образом ваш код будет простым, и с помощью одного метода вы можете использовать несколько путей для каждого вызова :)

Ahmad
источник
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);
NetUser
источник
Добро пожаловать в stackoverflow. Небольшое дополнительное объяснение помогло бы товарищам-программистам понять, почему решение сработало.
NJInamdar
1

Независимо от того, работаете ли вы в контексте ASP.NET или нет, вы должны иметь возможность использовать HostingEnvironment.ApplicationPhysicalPath

daudihus
источник
0

Server.mappath ("") будет работать на странице aspx, если вы хотите получить абсолютный путь из файла класса, вы должны использовать это -

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Дебендра Дэш
источник