ASP.NET의 외부 C # 클래스에서 Server.MapPath 사용


132

C # 클래스에서 특정 파일의 절대 경로를 얻으려고합니다. Server.MapPath물론 ASPX 및 코드 숨김 페이지에서 훌륭하게 작동하지만 다른 클래스 파일에는 존재하지 않습니다. 시도 HostingEnvironment.MapPath()했지만 상대 가상 경로가 허용되지 않는다고 불평합니다. 이견있는 사람?

System.Web 이미 가져 왔습니다.

답변:


302

ServerUtility클래스는의 인스턴스로 사용할 수 있습니다 HttpContext. ASP.Net 파이프 라인 내에서 실행된다는 것을 알고있는 환경에 있다면

HttpContext.Current.Server.MapPath()

System.Web그래도 가져와야 합니다.


1
이 게시물이 2 세 이상 이었지만 나를 도와주었습니다. 감사.
iarwain01

6
해당 파이프 라인에서 실행되지 않으면 어떻게됩니까?
zaitsman

ASP.Net 내부에서 실행하지 않으면 자체 파이프 라인을 작성하지 않은 한 HttpContext가 설정되지 않을 가능성이 높습니다. 프로세스가 경로 라우팅의 기본 사항에 대한 통찰력을 가지고 있다면 System.IO.Path 메소드를 살펴볼 수 있습니다.
womp

이 컴파일되었지만 컨텍스트는 컨트롤러 외부에서 null이므로 코드 오류가 발생했습니다. 나는 womp가 같은 것을 말하는 것 같습니다. 그렇다면 라우터 외부에서 MapPath에 액세스 할 수 있습니까?
edencorbin 2019

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

물론 외부 클래스에 대한 참조를 추가 할 수 있습니다. 그러나 분명히 서버 요청의 컨텍스트에서 사용해야하므로 HttpContext가 null이 아닙니다.
Dan Diplo

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

가져 오려는 파일이 유형의 어셈블리 위치 인 경우 그러나 파일이 어셈블리 위치를 기준으로하는 경우 System.IO네임 스페이스 와 함께 사용 하여 파일의 정확한 경로를 얻을 수 있습니다.


-1 : 그가 집회 장소를 원한다고 믿게 만든 이유는 무엇입니까?
John Saunders

1
그는 "확실한 파일"이라고 말하면서 파일의 위치 나 특성을 지정하지 않았으므로 조립 위치를 알고 해당 경로와 관련하여 작업 할 수 있다는 것이 도움이 될 수 있습니다. 물론 그가 실제로 HttpContext에 있다고 말하면 대답하지 않아도됩니다.
David McEwing

IIS가 웹 사이트의 어셈블리를 설치 한 위치에서 어셈블리를로드하지 않기 때문에 David McEwing은 제안하지 않습니다. 그것들은 임시 asp.net 캐시 위치에서 복사 및로드되므로 GetAssembly 또는 GetExecutingAssembly를 수행하면 어셈블리 위치를 가리 키지 만 MapPath가 가리키는 웹 사이트 위치와는 아무런 관련이 없습니다.
zumalifeguard

4

나도 이것을 사용한다 :

System.Web.HTTPContext.Current.Server.MapPath

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

클래스 파일에서 절대 경로를 얻으려면 aspx 페이지에서 server.mappath ( "")가 작동합니다.

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.