현재 경로 표시관련 오류질문입니다

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.CurrentDirectoryD:\test\stats가 될 수 없습니다. 왜냐하면 D:\test가 가 아마도 CurrentDirectory일 것이기 때문입니다.

제가 했을때는 D:\test\stats 폴더안에 A프로그램에서 호출하는 프로그램을 단독으로 실행하는 경우 D:\test\stats 이렇게 표시됩니다.

네 그것은 CurrentDirectory를 썼기 때문이고요. 프로세스를 실행 할 때 별도의 작업경로를 지정하지 않으면 A의 경로가 CurrentDirectory가 됩니다.

이제 전체적인 경로를 체크해봐야 할것 같습니다.

  1. A프로그램의 경로
  2. 호출되는 프로그램의 경로
  3. 최종 접근하고자 하는 경로

만약, 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