이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 31124|회답: 2

[콘솔 프로그램] 현재 디렉터리를 얻으려면 System.Environment.CurrentDirectory를 주의하세요

[링크 복사]
게시됨 2020. 11. 10. 오후 3:04:17 | | | |
최근 작업에서는 고객 알림을 위한 작은 도구를 만들고 싶습니다; 당연히 winform 프로그램은 애플리케이션과 동일한 디렉터리의 구성 파일을 읽어야 하며(exe.config 파일이 아님),

현재 애플리케이션이 위치한 디렉터리를 읽으려면, 즉시 System.Environment.CurrentDirectory를 사용해 현재 작업 디렉터리를 얻었습니다. 프로그램은 완벽하게 실행되는 것 같아요;

다음 날 아침 출근했을 때, "설정 파일 읽기 누락됨"이라는 메시지가 떴습니다. 앱에는 부팅 자동 시동 기능이 추가되어 있습니다. 이 메시지는 구성 파일 실패를 읽으면 즉시 애플리케이션 디렉터리의 구성 파일이 스스로 삭제되었는지 확인합니다. 확인해보니 파일이 여전히 남아 있었고, 프로그램을 종료하고 다시 실행했습니다

그래도 괜찮고, 팝업 읽기 프로필도 없어요. 그다음 레지스트리의 부팅 항목 경로가 내 디렉터리에 없는지 확인해 보세요. 경로 파일을 보니 괜찮아. 조금 헷갈리나요? 컴퓨터에서 로그아웃하고 재시작을 시도해도 여전히 화면 팝업이 나타나고 설정 파일이 없었습니다. 길을 찾지 못하는 이유는 직접적으로 밝혀질 것입니다

MessageBox, 프로그램이 실행되어 경로가 실제로 이 경로임을 확인합니다.

MessageBox 코드를 추가하고 테스트를 계속 시작하세요. 부팅했을 때 현재 나타난 디렉터리가 C:\Windows\System32였고, 바로 혼란스러웠습니다. 나는 속으로 생각했다, 혹시 노자의 프로그램이 system32까지 내려갔던 건가? 레지스트리를 확인해보니 sysetm32에 제 앱이 없더라고요. 마지막으로, 경로를 얻는 코드에 문제가 있을 거라고 생각했습니다.

반복 테스트 끝에 System.Environment.CurrentDirectory가 현재 디렉터리를 가져오는 데 사용하지만, 프로그램 A가 프로그램 B를 호출하고 프로그램 B가 디렉터리를 가져오기 위해 System.Environment.CurrentDirectory를 사용한다면 그러면 B 프로그램에서 얻은 디렉터리는 더 이상 B 애플리케이션이 위치한 디렉터리가 아니며; 이 디스크는 A가 위치한 디렉터리가 됩니다. 부팅 시 나타나는 디렉터리가 C:\Windows\System32인 것을 찾는 것은 어렵지 않습니다. 왜냐하면 부팅 자가 시작 프로그램이 윈도우의 프로세스에 의해 호출되기 때문입니다.

따라서 winform 프로그램이 현재 애플리케이션이 위치한 디렉터리를 얻으려 한다면, System.Environment.CurrentDirectory를 사용하지 않는 것이 좋습니다. 대신 Application.StartupPath가 되어 있습니다. 이렇게 하면 누가 부르든 상관없습니다.

테스트 코드:




전근 출처:하이퍼링크 로그인이 보입니다.




이전의:K8S 네트워크 플란넬과 캘리코 비교
다음:C#은 프로빙을 통해 참조 라이브러리 DLL을 하위 폴더에 넣습니다
 집주인| 게시됨 2020. 11. 10. 오후 3:08:26 |
C#은 현재 실행 중인 프로그램을 얻기 위한 여러 메서드의 집합입니다

현재 프로세스의 전체 경로와 파일 이름(프로세스 이름)을 받아보세요.
스트링 스트랴 = 이것입니다. GetType(). 집회. 위치;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

새로운 프로세스 컴포넌트를 받아 현재 활성 프로세스와 연관시키는 메인 모듈로 가는 전체 경로, 파일 이름(프로세스 이름)을 포함합니다.
string str = System.Diagnostics.Process.GetCurrentProcess(). MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

어셈블리 충돌 해결기가 어셈블리를 탐색하는 데 사용되는 현재 스레드의 애플리케이션 도메인 기본 디렉터리를 얻습니다.
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

애플리케이션을 포함하는 디렉터리 이름을 얻고 설정하세요. (추천)
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

실행 파일 이름을 제외하고 애플리케이션을 시작한 실행 파일의 경로를 얻으세요.
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

애플리케이션의 현재 작업 디렉터리를 받으세요(신뢰할 수 없음).
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)
게시됨 2021. 9. 22. 오후 8:38:52 |
배우기 시작해...
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com