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

在ASP.NET的外部C#类中使用Server.MapPath,c#,asp.net,file,path,relative-path,C#,Asp.net,File,Path,Relative Path,我试图获取C#类中某些文件的绝对路径Server.MapPath当然对ASPX及其代码隐藏页面非常有效,但这在另一个类文件中并不存在。我尝试了HostingEnvironment.MapPath(),但这表明不允许使用相对虚拟路径。有什么想法吗 System.Web已导入。ServerUtility类在您的HttpContext中作为实例提供。如果您所处的环境知道它将在ASP.Net管道中执行,那么可以使用 HttpContext.Current.Server.MapPath() 不过,您必须

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


System.Web
已导入。
ServerUtility
类在您的
HttpContext
中作为实例提供。如果您所处的环境知道它将在ASP.Net管道中执行,那么可以使用

HttpContext.Current.Server.MapPath()

不过,您必须导入
System.Web

您能否只添加对
System.Web
的引用,然后就可以使用
Server.MapPath

编辑:现在我建议使用:

它是
System.Web
程序集中的一种静态方法,用于将虚拟路径映射到服务器上的物理路径。它不需要引用
HttpContext

System.Reflection.Assembly.GetAssembly(type).Location
如果尝试获取的文件是类型的程序集位置。但是,如果文件是相对于程序集位置的,则可以将其与
System.IO
命名空间一起使用,以获得文件的确切路径

class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}
现在,当您从codebehind调用该方法时

例如:

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}
通过这种方式,您的代码变得非常简单,使用一种方法,您可以为每个调用使用多个路径:)

我也使用这种方法:

System.Web.HTTPContext.Current.Server.MapPath
您还可以使用:

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

无法访问

这个对我有帮助

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

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

服务器.mappath(“”)将在aspx页面上运行,如果您想从类文件中获取绝对路径,则必须使用此-

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

-1:是什么让你相信他想要程序集的位置?他说“某些文件”他没有指定文件的位置或性质,因此了解程序集位置并能够相对于该路径工作可能会有所帮助。当然,如果他真的说他仍然在HttpContext中,那么我就不会费心回答了。David McEwing,你的建议行不通,因为IIS不会从网站中安装程序集的位置加载程序集。它们是从临时asp.net缓存位置复制和加载的,因此执行GetAssembly或GetExecutionGassembly将指向程序集的位置,但与MapPath指向的网站的位置无关。请确保可以将引用添加到外部类;但是很明显,你需要在服务器请求的上下文中使用它,这样HttpContext就不会为null。尽管这篇文章已经有两年多的历史了,但是你帮了我很大的忙。谢谢。如果它没有在该管道中执行呢?如果你没有在ASP.Net中执行,那么你的HttpContext不太可能被设置,除非你编写了自己的管道:)你必须依赖执行上下文(路由器?)提供的任何方法。如果您的流程了解路径路由的基本知识,您可以查看System.IO.path方法。此方法已编译,但控制器之外的上下文为null,因此我的代码错误。我认为沃姆普也在说同样的话。如果是这样的话,你能在路由器之外访问MapPath吗?欢迎使用stackoverflow。再多解释一下就可以帮助其他程序员理解解决方案的作用。
HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")