在ASP.NET中,在外部C#类中使用Server.MapPath

140
我尝试获取C#类中某些文件的绝对路径。当然,对于ASPX和其代码后备页面,Server.MapPath非常好用,但在另一个类文件中不存在。我尝试使用HostingEnvironment.MapPath(),但它抱怨相对虚拟路径不被允许。有什么想法吗?

System.Web已导入。

9个回答

317

ServerUtility类是作为HttpContext实例可用的。如果您身处一个环境中,您知道它将在ASP.Net管道内执行,您可以使用。

HttpContext.Current.Server.MapPath()

但是您需要导入 System.Web


1
尽管这篇文章已经超过2年了,但你对我帮助非常大。谢谢。 - iarwain01
6
如果不在那个流程中执行会怎么样? - zaitsman
如果您不是在ASP.Net内执行,则您的HttpContext可能没有被设置,除非您编写了自己的管道 :) 您必须依赖于您的执行上下文(路由器?)提供的任何方法。如果您的进程了解基本的路径路由信息,可以查看System.IO.Path方法。 - womp
这个编译通过了,但是在控制器之外上下文为空,所以我的代码出错了。我想womp也是在说同样的事情。如果是这种情况,你能在路由器之外访问MapPath吗? - edencorbin

35

您也可以使用:

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

如果

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

无法访问


10

你可以添加对 System.Web 的引用,然后就能使用 Server.MapPath 了吗?

编辑:现在我建议使用 HostingEnvironment.MapPath 方法

HostingEnvironment.MapPathSystem.Web 组件中的静态方法,它能将虚拟路径映射到服务器上的物理路径。它不需要引用 HttpContext


当然可以添加对外部类的引用;但显然您需要在服务器请求的上下文中使用它,以便HttpContext不为空。 - Dan Diplo

4
我使用这个工具:
System.Web.HTTPContext.Current.Server.MapPath

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

如果您要获取的文件是某种类型的程序集位置。但如果文件相对于程序集位置,则可以使用System.IO命名空间来获取文件的确切路径。

你为什么觉得他要获取汇编的位置? - John Saunders
1
他说 "某些文件",但没有指定这些文件的位置或性质,因此了解程序集的位置并能够相对于该路径工作可能会有所帮助。当然,如果他实际上声明仍处于 HttpContext 中,我就不会费心回答了。 - David McEwing
David McEwing,你提出的建议行不通,因为IIS不会从安装程序集的位置加载它们,而是从临时的asp.net缓存位置复制和加载它们。因此,执行GetAssembly或GetExecutingAssembly将指向程序集的位置,但与MapPath指向的Web站点位置无关。 - zumalifeguard

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。稍微多解释一下会帮助其他程序员理解为什么这个解决方案可行。 - Nagama Inamdar

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);
}

以这种方式,您的代码非常简单,使用一个方法即可为每个调用使用多个路径 :)

2
无论你是在ASP.NET的上下文中运行还是不在,你都应该能够使用HostingEnvironment.ApplicationPhysicalPath。

0

在aspx页面上,server.mappath("")可以正常工作,但如果你想从一个类文件中获取绝对路径,你必须使用这个方法-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接