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

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

  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)

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



답변

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

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

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

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

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


답변

  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 파일이 있는 디렉토리가 됩니다.

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


답변

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

Application.StartupPath

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

System.IO.Directory.GetCurrentDirectory()

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


답변

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

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

위의 코드 설명


답변

실제로 로그인 한 사용자의 세션에서 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

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


답변

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

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

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


답변

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

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

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