외규장각 도서 환수 모금 캠페인

Search Results for '상대경로'

1 POSTS

  1. 2007.06.07 상대경로에서 절대경로 계산하기 2

void Symbut::GetAbsolutePath()
{
 char szBackup[200] = "";
 char szCurrentPath[200] = "";
 char drive[10] = "";
 char dir[100] = "";
 char fname[50] = "";
 char ext[10] = "";

 GetCurrentDirectory(200, szBackup);  // 현재의 경로를 백업
_splitpath((LPCSTR)(LPCTSTR)szWorkFolder, drive, dir, fname, ext);

 if (isalpha(dir[0])) // do not need to transform
  return;
 else
 {
  while (szWorkFolder.Find("..") == 0)
  {
   _chdir("..");
   szWorkFolder.TrimLeft("..");
  }

  while (szWorkFolder.Find(".") == 0)
  {
   _chdir(".");
   szWorkFolder.TrimLeft(".");
  }
  GetCurrentDirectory(200, szCurrentPath);
  SetCurrentDirectory(szBackup);
  szWorkFolder = szCurrentPath + szWorkFolder;  
 }
}


_chdir 함수를 쓰면 현재 작업 디렉토리(Working Directory)를 변경시켜준다. 즉, 파라미터로 넘겨준 값을 가지고 cmd 창에서  cd "파라미터" 한 것과 같은 효과를 낼 수 있다.

그래서 입력 받은 상대 경로를 절대 경로로 변경하기 위해서 .. 의 수만큼 _chdir을 호출하여 작업 경로를 변경시킨 후에 GetCurrentDirectory()  함수를 호출하여 작업 경로를 얻어오고 ..을 제외한 나머지 경로를 뒤에 덧붙이는 식으로 절대 경로를 만들 수 있다.

그런데 이러한 과정에서 작업 경로가 바뀌면 프로그램의 다른 부분에서 작업경로에 기준하여 참조하는 다른 파일이( ini 파일과 같은) 있을 경우에 해당 파일을 찾을 수 없다는 에러를 발생 시키게 된다. 따라서 작업 경로를 변경하며 절대경로를 얻어오기 전에 미리 현재의 작업 경로를 저장해두었다가 나중에 다시 가져오는 방법을 사용했다.

GetCurrentDirectory() 함수는 이처럼 현재의 작업 경로를 얻어오는 함수인데, 작업 경로는 기본적으로 실행파일이 위치하고 있는 경로이지만 별도로 설정해 줄 수 있기 때문에 (SetCurrentPath 함수, 혹은 _chdir 함수 등을 이용) 현재 실행되고 있는 파일의 경로를 정확하게 얻어오기 위해서는 GetModuleFileName함수를 사용하는 것이 좋다고 한다. (이승희 주임님 말씀 ㅋ)

그리하여 함 해볼려그랬더니 GetModuleFileName은 모듈의 핸들값을 받아가야되는거다.
경로 얻어올려고 별로도 핸들 구해서 하기도 그렇고 해서 그냥 썼다 -_-;

결과적으로 어떻게 되긴 되는데 뭔가 굉장히 깔끔한 방법이 없나..
이놈의 심벗뜨는 언제쯤 제대로 돌아가려나 ㅋㅋ
Response : ,


Recent Posts

Recent Comments

Recent Trackbacks

Total hit (Today , Yesterday )

Admin Write Post