C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[806] [System] 현재 디렉토리(Current Directory)에 대해
장성호 [nasilso] 10959 읽음    2008-09-24 03:21
현재 디렉토리(Current Directory)에 대해..

[서론]
프로그램을 하다 보면 각종 설정 파일이나 이미지,사운드 등 리소스 파일 또는
db파일 , dll 및 라이브러리 등등 각종 파일을
시스템 폴더나 혹은 프로그램이 설치된 폴더아래에 두고 사용하는 경우가 많다

아니 거의 대부분이 아닐까?


대게 프로그램이 설치되면 실행파일(exe)이 있는폴더가 프로그램 설치폴더가 된다.

그런데 프로그램이 실행되면
대부분의 경우에는 CurrentDirectory 와 실행파일(exe)이 있는폴더가 같지만
그렇지 않는 경우도 많다.
그리고 무엇보다 중요한것은 CurrentDirectory는 얼마든지 바뀔 수 있다는 것이다.


[CurrentDirectory 가 바뀌는 경우]

1. SetCurrentDirectory 또는 SetCurrentDir(VCL) 로 현재디렉토리를 직접 바꾸는 경우

2. SaveDialog 나 OpenDialog등으로 Dialog를 Execute해서 파일을 선택 , 확인한 경우     --  매우 주의

3. 기타 .. 잘모름

경험상 가장 많은 실수를 하는경우가 두번째 경우인 Dialog를 이용하는 경우였다.



[프로그램 시작할대 CurrentDirectory와 exe폴더가 다른 경우]

그런데 SetCurrentDir 로 현재폴더를 바꾸지도 않았고, Dialog 쓰지도 않은
프로그램이 막 시작하는 시점에서도  CurrentDirectory가 실행파일(exe)이 있는 폴더와 다른경우가 있다.


1. 다른 프로그램에서 현재 프로그램을 실행했을때
   대게 자신을 실행한 프로그램의 Current-Directory가 현재프로그램의 Current-Directory가 된다.

2. 시작프로그램에 등록되어있는 경우
  
3. 확장자가 등록되어있는경우에  
    탐색기에서 데이타 파일(*.txt  ,  *.ini  , *.zip ...) 을 클릭해서 프로그램을 실행하는 경우.

4. 기타 (잘모름)



[CurrentDirectory와 상관없이 실행파일(exe)이 있는 폴더를 확인하려면]

1. GetModuleFileName 함수를 이용해 실행파일(exe) 전체 경로를 가져온 후에 맨뒤 파일 이름만 짤라낸다.

2. VCL에서는 ParamStr(0) 와 Application->ExeName 이라는 String 형의 실행파일전체 경로를 제공한다.
   
   이 경로를 이용해 ExtractFilePath 함수로 실행파일이 있는 Directory를 확인할수 있다.

   String sExePath = ExtractFilePath(ParamStr(0));  //이렇게

   그런데 사실 Application->ExeName 은 ParamStr(0) 를 return 하고
   ParamStr(0) 에서는 GetModuleFileName 이라는 API를 이용해서 실행파일 전체 경로를 구한다.



[프로그램을 실행할때 CurrentDirectoy와 실행파일(exe)의 경로를 같게 하려면]

1. CreateProcess로 프로그램을 실행할경우 CurrentDirectoy를 설정해서 호출해주면 된다.
   CreateProcess함수의 8번째 파라메터가 CurrentDirectoy 이다.

2. ShellExecute로 프로그램을 실행할경우
   ShellExecute함수의   5번째 파라메터가 CurrentDirectoy 이다. 여기에 실행파일과 같은 경로를
   설정해서 호출해주면 된다.

3. 기타... 잘모름



[ ./ 나 ..\ 등 상대경로를 사용하는경우 ]

가끔 상대경로를 사용하는 경우를 보는데
이경우 상대경로의 기준이 실행파일(exe)이 있는 폴더로 아는 사람이 있는데
상대경로의 경우도 기준이 CurrentDirectory이다.



[결론]

1. CurrentDirectory는 얼마든지 변경이 될수 있다.
2. 상대경로의 기준도 CurrentDirectory이다.
3. CurrentDirectory를 사용하지 말고
   프로그램의 실행파일(exe)를 이용해 실행파일폴더를 구해 사용하라



[추천]
개인적으로 프로그램이 시작할때 실행파일의 경로를 Global변수에 구하여 넣은후에
프로그램 전체에서 사용한다.

다름과 같이 사용해도 되지만..
String sFName= ExtractFilePath(ParamStr(0))+ "Images\\logo.jpg" ;

ParamStr(0)는 사용할때마다 GetModuleFileName라는 API가 호출된다.

그럼..
크레브 [kkol]   2008-09-24 08:23 X
자주 사용하고 있고 혼동하고 있는 사람도 많은데..
깔끔하게 정리해주시니 보기 좋습니다. ^^
외랑 [jaehuns]   2008-09-29 10:45 X
저는 이렇게 사용하는데... 문제가 있으려나요...

AnsiString ExeFileName = Application->ExeName;   // 실행파일명
AnsiString sPath = ExtractFilePath(Application->ExeName);   // 실행 파일 패스

장성호 [nasilso]   2008-09-29 11:58 X
Application->ExeName 과 ParamStr(0) 은  같습니다.
문제 없습니다.

+ -

관련 글 리스트
806 [System] 현재 디렉토리(Current Directory)에 대해 장성호 10959 2008/09/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.