현재 폴더 경로 가져 오기


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