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


132

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

System.Web 已导入。

Answers:


302

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

HttpContext.Current.Server.MapPath()

不过,您必须导入System.Web


1
即使这篇文章已有2年以上的历史了,您还是对我有很大帮助。谢谢。
iarwain01 2011年

6
如果未在该管道中执行该怎么办?
zaitsman

如果您不在ASP.Net中执行,则除非您编写了自己的管道,否则不太可能设置HttpContext :)您将不得不依靠执行上下文(路由器?)提供的任何方法。如果您的过程对路径路由的基础有所了解,则可以看看System.IO.Path方法。
womp '16

在控制器之外,此已编译但上下文为空,因此我的代码出错。我认为womp在那儿说的是同样的话。如果是这样,您可以在路由器外部访问MapPath吗?
edencorbin '19

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


不在外部类中。
funwhilelost 2010年

当然,您可以将引用添加到外部类。但是显然您需要在服务器请求的上下文中使用它,因此HttpContext不为null。
Dan Diplo

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

如果您要获取的文件是某个类型的汇编位置。但是,如果文件相对于程序集位置,则可以将其与System.IO名称空间一起使用,以获取文件的确切路径。


-1:是什么让您相信他想要装配的位置?
约翰·桑德斯

1
他说“某些文件”他没有指定文件的位置或性质,因此了解组装位置并能够相对于该路径工作可能会有所帮助。当然,如果他实际上说他仍在HttpContext中,那么我就不会打扰回答。
David McEwing

David McEwing,您的建议将不起作用,因为IIS不会从网站上的安装位置加载程序集。它们是从临时的asp.net缓存位置复制并加载的,因此执行GetAssembly或GetExecutingAssembly将使您指向程序集的位置,但与MapPath指向的网站的位置无关。
zumalifeguard 2014年


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 2014年

1

无论您是否在ASP.NET上下文中运行,都应该能够使用HostingEnvironment.ApplicationPhysicalPath


0

server.mappath(“”)将在aspx页面上运行,如果要从类文件中获取绝对路径,则必须使用以下命令:

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.