현재 폴더 경로 가져 오기


222

파일을 변환하는 프로그램을 만들고 싶습니다. 사용자가 모든 디렉토리에 실행 파일을 배치 할 수 있기를 원하며 해당 프로그램을 실행할 때 (.exe를 두 번 클릭하면) exe 파일이있는 현재 폴더 내에서 모든 파일 을 처리하도록 프로그램을 원합니다 . 프로그램이 현재 실행중인 경로를 어떻게 확인할 수 있습니까?

나는 시도 System.Windows.Forms.Application.StartupPath했지만 그것은 잘못된 길로 보인다.

어떤 아이디어?

답변:


334

현재 디렉토리가 실행 폴더와 다를 수 있으므로 특히 단축키를 통해 프로그램을 실행할 때 사용 해서는 안됩니다Directory.GetCurrentDirectory() .

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);당신의 목적 을 위해 사용 하는 것이 좋습니다 . 현재 실행중인 어셈블리가있는 경로 이름을 반환합니다.

Soner Gönül 가 그의 답변에서 말했듯이 내 제안 된 접근 방식을 사용하면 실행중인 어셈블리, 엔트리 어셈블리 또는 다른로드 된 어셈블리를 구별 할 수 있지만

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

충분할 수도 있습니다. 이것은 같을 것입니다

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly ()와 GetExecutingAssembly ()는 흥미로운 차이점이 있습니다. 자세한 내용은 stackoverflow.com/a/18562036/30289
— bhadra

3
내가 말했듯이 : 현재 실행중인 어셈블리 가있는 경로 이름을 반환 합니다. 사이의 차이 GetEntryAssembly와 GetExecutingAssembly놀랄만큼 오지 않는다 또한 함수 이름으로 분명하다. 그들이 똑같이했다면 왜 두 가지 기능이 있어야합니까? :-)
— Thorsten Dittmar


9
이것은 System.Reflection에 System.Reflection.Assembly.GetExecutingAssembly().Location있습니다. 즉, 직접 실행 창에서 테스트하는 경우
— Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

그러면 응용 프로그램의 실행 디렉토리가 제공됩니다. 심지어 웹 애플리케이션에서도 작동합니다. 나중에 파일에 도달 할 수 있습니다.


9
이것은이 목적으로 사용하기에 가장 정확한 속성입니다. CurrentDomain의 BaseDirectory는 AppDomain이 동적으로 만들어 져서 다른 위치에서 어셈블리를 보더라도 항상 올바른 위치를 가리 킵니다.
— dhruvin

완전한. 이것은 특히 응용 프로그램 유형에 따라 다른 절대 경로를 읽을 수있는 Streamreader를 사용할 때 모든 응용 프로그램에 독립적으로 작동합니다.
— user3326078

40

다음 코드를 사용하여 간단한 콘솔 응용 프로그램을 만들었습니다.

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

결과 실행 파일을에 복사했습니다 C:\temp2. 그런 다음 해당 실행 파일에 대한 바로 가기를 C:\temp3에 넣고 실행 한 번 (exe 자체에서 한 번, 바로 가기에서 한 번) 실행했습니다. 다음과 같은 두 가지 출력을 모두 제공했습니다.

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

난 동안 확인이 있어야합니다 몇 가지 가 있습니다 이유를 설명하는 cockamamie 이유 다섯 개 가지 방법이 거의 동일한 일을, 나는 확실히 그게 뭔지 모르겠어요. 그럼에도 불구하고, 대부분의 상황에서 당신이 좋아하는 것을 자유롭게 선택할 수 있습니다.

업데이트 : "시작 위치 :"필드를로 변경하여 바로 가기 속성을 수정했습니다 C:\temp3. 결과는 다음과 같습니다.

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... 적어도 입증하는 몇 가지 다른 방법 사이의 구분의를.


2
대단히 감사합니다.
— baj9032

중요한 메모. 작업 디렉토리가 항상 설치된 디렉토리와 같지는 않습니다.
— Jordan


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

에서 Path.GetDirectoryName

지정된 경로 문자열에 대한 디렉토리 정보를 리턴합니다.

에서 Application.ExecutablePath

실행 파일 이름을 포함하여 응용 프로그램을 시작한 실행 파일의 경로를 가져옵니다.


19

이것을 사용하십시오.

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

이것도 사용할 수 있습니다.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

에 대한 .NET CORE의 사용System.AppContext.BaseDirectory

(를 대신하여 AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

삼.

Environment.CurrentDirectory

Environment.CurrentDirectory여러 가지 방법 (shotrtcut 설정 등)에서 변경할 수 있습니다
— Yousha Aleayoub


0

exe 경로를 원한다면 사용할 수 있습니다 System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

이것은 특히 dotnet 코어 단일 파일 게시를 사용할 때 가장 효과적입니다. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

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