exe파일이 있는경로 표시를 위해
public static string WorkingDirectory = Path.Combine(Environment.CurrentDirectory, “stats”);
이렇게 사용했습니다.
이 프로그램만 단독으로 실행했을때는 폴더가 중첩되어도
전체경로가 잘 표시됩니다.(D:\test\stats)
그러나 A프로그램에서 버튼을 클릭하면 이 프로그램이 실행되게했는데 경로가 D:\test 이렇게만 표시됩니다.
그래서 stats를 combine한것인데 그럼에도 경로표시가 제대로 되지않습니다. 실제로는 stats 폴더에 있는 프로그램을 실행하고 그 경로가 D:\test\stats 이것인데 말이죠…
계속 시도해서 써치해봤지만 도저히 해결운 못해서 질문드립니다.
왜 D:\test
만 표시되는지는 모르겠습니다. 하지만,
Environment.CurrentDirectory는 현재 작업 디렉토리를 반환하므로 원하시는 올바른 경로를 얻을 수 없습니다.
var result = System.Reflection.Assembly.GetExecutingAssembly().Location;
var path = System.IO.Path.GetDirectoryName(result);
Console.WriteLine(path);
실행중인 어셈블리의 경로를 기준으로 해서 접근하는게 좋습니다.
이 방법을 해봤습니다. 제 기억으로는 /bin 폴더까지 경로가 나오는것으로 기억하는데 제가 본문처럼 경로를 얻은것은 그 경로에 xml 파일들을 읽어서 처리하는 부분들이 있기때문입니다.
그래서 제가 필요한경로는 딱 저기까지였기때문에 저런식으로 얻은것입니다.
그 후 A프로그램에서 저 프로그램을 실행하려는 계획이었고, 프로그램을 실행했는데 정상적으로 실행이 되지않아 확인해보니 경로가 본문처럼 다르게 표시되는 문제에 현재 봉착해있습니다.
답변 감사드립니다.
어떻게 원인을 찾으셨는지 모르겠습니다. Path.Combine
의 경우 실제 경로와 상관없이 경로를 만들어줍니다. 즉, Path.Combine
에 의해서 D:\test
의 결과가 나온게 아니라 다른 원인이 있다고 생각합니다.
이왕이면, WorkingDirectory
를 readonly로 바꾸셔서 외부의 요인을 제거하시는 것도 방법일 것 같습니다.
※ 제가 소스코드와 소스코드의 량을 측정할 수 없으므로 Path.Combine
관점에서 드립니다.
아직원인을 찾지는 못했습니다. ㅠㅠ 해결을 못한 상태입니다.
실행파일이 D:\test\stats 이 경로에 위치해있습니다.
public static string WorkingDirectory = Environment.CurrentDirectory;
MessageBox.Show(WorkingDirectory);
이렇게 프로그램 시작시 메시지박스를 표시합니다.
실행파일이 위치한 경로에서 단독으로 프로그램으로 실행합니다.
그러면 경로가 (D:\test\stats) 이렇게 표시됩니다.
그러나 A프로그램에서 이 프로그램을 실행하면 경로가 (D:\test) 이렇게만 표시가됩니다.
공유주신 코드만 봤을 떄는 Environment.CurrentDirectory
는 D:\test\stats
가 될 수 없습니다. 왜냐하면 D:\test
가 가 아마도 CurrentDirectory
일 것이기 때문입니다.
제가 했을때는 D:\test\stats 폴더안에 A프로그램에서 호출하는 프로그램을 단독으로 실행하는 경우 D:\test\stats 이렇게 표시됩니다.
네 그것은 CurrentDirectory를 썼기 때문이고요. 프로세스를 실행 할 때 별도의 작업경로를 지정하지 않으면 A의 경로가 CurrentDirectory가 됩니다.
이제 전체적인 경로를 체크해봐야 할것 같습니다.
- A프로그램의 경로
- 호출되는 프로그램의 경로
- 최종 접근하고자 하는 경로
만약, 3이 2의 하위 경로라면, 2의 호출되는 프로그램의 경로에서 실행경로
를 기준으로 하위 경로로 진입해야 합니다.
실행위치의 마지막에 \ 이 없기때문에 combine이 안된 것 같습니다.
D:>D:\Develop\WinStudy\ConsoleApp1\bin\Debug\netcoreapp3.1\ConsoleApp1.exe
System.IO.Directory.GetCurrentDirectory(): D:
Environment.CurrentDirectory: D:
AppDomain.CurrentDomain.BaseDirectory: D:\Develop\WinStudy\ConsoleApp1\bin\Debug\netcoreapp3.1\
— Path Combine —
System.IO.Directory.GetCurrentDirectory(): D:\runtimes
Environment.CurrentDirectory: D:\runtimes
AppDomain.CurrentDomain.BaseDirectory: D:\Develop\WinStudy\ConsoleApp1\bin\Debug\netcoreapp3.1\runtimes