|
소심남 님이 쓰신 글 :
: FILE *f = fopen("C:\\FileName", "w+" );
:
: 위와 같이 하면 C드라이브 루트에 있는 filename이라는 파일을 열수 있습니다.
: 헌데.. 저렇게 고정된 어느 한 파일을 열어보는 것이 아니라,
: 그 프로그램이 실행되는 폴더내의 file을 열려고 하려면 어떻게 하나요..?
:
: 예를 들어 실행 파일이
: c:\Program files\Launch\에 있거나
: c:\Utility\에 있거나 상관없이 그 폴더 내의 파일에 접근하려면
: 어떻게 하는지요..?
:
임펠리테리입니다.
죄송합니다만, 아래 박세용님의 답변에는 약간의 문제가 있군요.
프로그램이 있는 디렉토리와 현재 디렉토리는 다를 수도 있습니다. 예를 들면, 메모장은 일반적으로 윈도우즈 디렉토리에 있는데, 명령줄에서 아무 디렉토리에서나 notepad.exe라고 입력해도 실행이 되지요? 윈도우즈 디렉토리가 보통 디폴트 검색 패스(path 환경변수)에 포함되어 있기 때문에 당연합니다. 이런 경우, 윈도우즈 디렉토리가 실제 프로그램이 있는 디렉토리가 되고, 현재 디렉토리는 다른 곳일 수도 있습니다. 다른 예도 있습니다. 윈도우즈에서는 보통 실행파일에 대해 단축아이콘을 만들어서 쓰는 경우가 많은데, 단축아이콘의 등록정보를 보시면 가리키는 원본 파일을 지정하는 외에 별도로 "시작 위치"를 지정할 수 있게 되어있습니다. 같은 디렉토리를 지정하는 경우도 많습니다만 필요에 따라 다른 디렉토리를 지정할 수도 있는데, 여기서 "시작 위치"가 바로 탐색기가 해당 프로그램을 실행시킬 때 현재 디렉토리로 설정해주는 것입니다. 그러므로 이 두가지 위치가 다르게 지정된 경우에는 역시 프로그램이 있는 디렉토리와 현재 디렉토리가 달라집니다.
확실한 해결책은 하나 뿐입니다. 윈도우즈에서 모든 프로그램이 실행되면 인자를 하나도 넘겨주지 않아도 첫번째 인자로서 그 프로그램 자체의 패스가 넘어갑니다. 예를 들어, 그냥 "notepad" 라고 명령줄에서 입력하더라도 notepad.exe로는 "c:\windows\notepad.exe"라는 하나의 인자가 넘어가게 됩니다. 그러므로, 프로그램 자체로 넘어온 인자들 중 첫번째 것에서 프로그램이 있는 디렉토리를 추출해낼 수 있습니다.
원래 프로그램 자체애 대한 인자(명령프롬프트의 인자)는 프로그램의 엔트리포인트인 WinMain() 함수의 인자로 넘어오게 됩니다. 그런데 빌더에서는 보통 이 WinMain() 함수가 자동 생성된 코드로 되어 있어 다루기가 좀 귀찮습니다. 그래서 VCL에서 추가로 제공해주는 함수가 바로 ParamStr()입니다. 이 함수에 몇번째 인자를 알아내고 싶은지 인덱스를 넘기면 해당 번째의 인자를 돌려줍니다. 또한 파일이름을 포함한 전체 패스에서 디렉토리만 추출하고 싶은 경우에는 ExtractFilePath() 함수를 이용할 수 있습니다.
이유를 설명하느라 좀 썰이 길어졌는데.. 실제 방법은 아주 간단합니다. 다음의 한 라인이면 충분하지요.
AnsiString ProgramPath = ExtractFilePath(ParamStr(0));
그럼 참고하시길...
|