응용 프로그램 폴더 경로를 얻는 가장 좋은 방법


514

응용 프로그램 폴더 경로를 얻는 방법이 몇 가지 있습니다.

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

상황에 따라 가장 좋은 방법은 무엇입니까?


9
왜 우리는 응용 프로그램 경로를 얻을 수있는 많은 방법이 있습니다. 나는 길마다 이유가 있다고 생각합니다.
Leo Vo

1
# 6에 오류가 있습니다 : 읽어야합니다 : System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW

2
웹 프로젝트에있는 동안 # 6를위한 hooray, 나는 자연적으로 웹에 특화되지 않은 IoC로드 라이브러리에서 Server.MapPath 로직을 원하지 않았다
bkwdesign

우리는 이제 IHostEnvironment.ContentRootPath주입 된 IHostEnvironment의존성 (다른 유용한 것들을 포함)을 통해 액세스 할 수있는 신뢰할 수 있습니다 .
Timo

답변:


518

AppDomain.CurrentDomain.BaseDirectory 위치는 응용 프로그램 설치 디렉토리에 상대적인 파일에 액세스하는 데 가장 유용합니다.

ASP.NET 응용 프로그램에서 이것은 bin 하위 폴더가 아닌 응용 프로그램 루트 디렉토리가 될 것입니다. 일반적으로 원하는 것입니다. 클라이언트 응용 프로그램에서는 기본 실행 파일이 들어있는 디렉토리가됩니다.

VSTO 2005 응용 프로그램에서는 Excel 실행 파일의 경로가 아니라 응용 프로그램의 VSTO 관리 어셈블리를 포함하는 디렉토리가됩니다.

다른 환경은 환경에 따라 다른 디렉토리를 반환 할 수 있습니다 (예 : @ Vimvq1987의 답변 참조).

CodeBase파일이있는 곳이며 http : //로 시작하는 URL 일 수 있습니다. 이 경우 Location아마도 어셈블리 다운로드 캐시 일 것입니다. GAC 에서 어셈블리에 대해 CodeBase를 설정할 수는 없습니다 .


2
Windows XP 32 비트에서 테스트 할 때 바로 가기가 시작된 위치를 반환합니다.
Joshua 아들

1
1 @Joe 및 VSTO의 문서 수준의 부가 기능에서 볼 THIS

3
이렇게하면 끝에 백 슬래시가있는 경로가 반환됩니다. 결과적으로 프로세스 인수로 전달되는 문자열 형식을 지정할 때 문제가 발생했습니다.
avenmore

19
@avenmore-경로를 만들기 위해 문자열을 포맷하는 경우 Path.Combine대신 사용하는 것이 좋습니다. 이것은 후행 백 슬래시를 처리합니다.
Joe

1
이것은 VS 2017에서 루트 디렉토리가 아닌 bin / debug 폴더를 반환합니다.
SmoveBB

86
  1. Application.StartupPath및 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- 단지에 대한 작업 것입니다 윈도우 폼 응용 프로그램

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    예정 당신에게 뭔가를 제공합니다 : "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"당신이 실행하는 페이지입니다이다.

  3. AppDomain.CurrentDomain.BaseDirectory웹 응용 프로그램에 유용 할 수 있으며 "C:\\hg\\Services\\Services\\Services.Website\\"기본 디렉토리이며 매우 유용한 것과 같은 것을 반환 합니다.

  4. System.IO.Directory.GetCurrentDirectory() 그리고 5. Environment.CurrentDirectory

Visual Studio에서 디버그 모드로 실행되는 웹 앱의 경우 프로세스가 시작된 위치를 알려줍니다. "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

.dll웹 응용 프로그램의 경우 코드가 실행되는 위치를 알려줍니다."file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

이제 예를 들어 콘솔 앱 포인트 2-6의 경우 .exe 파일이 있는 디렉토리가 됩니다.

시간이 절약되기를 바랍니다.


2
"현재 폴더"를 원하는 것은
당연히

2
이것이 답입니다.
P.Brian.Mackey

59

이 메소드들 모두가 같은 값을 반환하지는 않습니다. 경우에 따라 동일한 값을 반환 할 수 있지만 목적이 다릅니다.

Application.StartupPath

StartupPath매개 변수를 리턴합니다 (응용 프로그램을 실행할 때 설정 가능)

System.IO.Directory.GetCurrentDirectory()

응용 프로그램이있는 폴더 일 수도 있고 아닐 수도있는 현재 디렉토리를 반환합니다. 동일합니다 Environment.CurrentDirectory. DLL 파일에서이 파일을 사용하는 경우 프로세스가 실행중인 경로를 반환합니다 (ASP.NET에서 특히 그렇습니다).


7
GetCurrentDirectory()다른 경로에서 물건을 달리는 것을 좋아하지 않기 때문에 사용하지 마십시오 . :(
kayleeFrye_onDeck

@kayleeFrye_onDeck 이전 질문에 대한 이유를 밝히지 않았습니다.
ns

10

웹 애플리케이션의 경우 현재 웹 애플리케이션 루트 디렉토리를 가져 오려면 일반적으로 현재 수신 요청에 대해 웹 페이지를 호출하십시오.

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

위의 코드 설명


6

실제로 로그인 한 사용자의 세션에서 Win32 API를 통해 Windows 서비스의 프로세스를 시작했습니다 (작업 관리자 세션 1에서 0이 아님). 이것에서 우리는 알 수 있습니다. 어떤 변수가 가장 좋은지.

위 질문의 7 가지 경우 모두 결과는 다음과 같습니다.

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

아마도 귀하의 경우에 가장 적합한 변수를 검색 할 때 동일한 일을하는 일부 사람들에게 도움이 될 것입니다.


4
매우 적절한 답변. 많은 사람들이 "working directory"! = "program directory"를 잊어 버립니다.
Nyerguds

3

내 경험상 가장 좋은 방법은 이것들의 조합입니다.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase bin 폴더를 제공합니다
  2. Directory.GetCurrentDirectory() .Net Core에서는 잘 작동하지만 .Net에서는 작동하지 않으며 프로젝트의 루트 디렉토리를 제공합니다
  3. System.AppContext.BaseDirectory그리고 AppDomain.CurrentDomain.BaseDirectory 작품 닷넷에서 미세하지만 닷넷하지 코어와 당신에게 프로젝트의 루트 디렉토리를 줄 것이다

.Net 및 .Net 코어를 대상으로하는 클래스 라이브러리에서 라이브러리를 호스팅하는 프레임 워크를 확인하고 하나를 선택하십시오.


2

나는 이것을 성공적으로 사용했다

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

linqpad 내부에서도 작동합니다 .


1
이것은 GetCurrentProcess의 여는 괄호가 없습니다. BTW은 C로 평가 : \ 프로그램 파일 \ DOTNET을 내 그물 핵심 프로젝트에서 Visual Studio에서 디버깅하는 동안 dotnet.exe가 위치한 먹으 렴 때문에
t0b4cc0

1

루트 디렉토리:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
이것은 현재 작업 디렉토리를 얻는 것처럼 보이지만 때로는 유용 할 수는 있지만 EXE 경로가 확실하지는 않습니다.
krowe2

0

루트 디렉토리를 얻는 것을 알고 있다면 :

string rootPath = Path.GetPathRoot(Application.StartupPath)

0

이로 System.IO.Path.GetDirectory(Application.ExecutablePath)변경System.IO.Path.GetDirectoryName(Application.ExecutablePath)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.