차근차근/C

[MFC] 현재 디렉토리 읽어오기

예쁜꽃이피었으면 2014. 9. 3. 14:16

http://sulac.egloos.com/viewer/4900069


인터넷이 있어서 행복합니다.. 받아온거 기쁘게 사용하겠습니다.. 흑흑.


[출처]http://mwultong.blogspot.com/2006/12/c-vc-current-folder-directory-name.html
         http://delicious.com/mwultong/cpp

direct.h 의 _getcwd() 함수로, "현재 디렉토리명"을 구할 수 있습니다. 즉 "폴더"의 이름을 얻는 것입니다.

현재 패스명, 디렉토리명 얻기 예제: _getcwd() Function Example


소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h>  // _MAX_PATH, free()
#include <direct.h>  // _getcwd()

int main(void) {
  // 평범한 방법으로 현재 디렉토리명 구하기
  char currentPath[_MAX_PATH];

  _getcwd(currentPath, _MAX_PATH);
  printf("%s\n", currentPath);

  // 260자 넘는 패스명(디렉토리명) 다루기
  char* s;

  s = _getcwd(NULL, 0);
  printf("%s\n", s);
  free(s);
}
char *_getcwd(char *buffer, int maxlen)

파라미터를
_getcwd(NULL, 0)
이렇게 주면, 패스명 최대 길이(_MAX_PATH)를 초과하는 디렉토리명, 즉, 260 바이트가 넘는 디렉토리명도 다룰 수 있습니다. NTFS 파일 시스템에서는 _MAX_PATH 보다 긴 패스도 허용됩니다. (이론적으로는 그렇지만 실제로는 풀 패스가 256자가 넘으면 오작동하는 프로그램들이 많습니다.) 그런데 이러면 _getcwd() 가 내부적으로 malloc 을 사용해 메모리를 할당하기에, 나중에 free()로 해제해 주어야 합니다

비주얼C++에서, "현재 작업 디렉토리(Current Working Directory)"를 변경하는 방법입니다.

_chdir() 함수를 사용하는데, 그렇지만 프로그램을 종료하면, 프로그램을 시작했던 디렉토리로 돌아갑니다. 즉, 프로그램 내부에서만 변경될 뿐, 완전히 변경되지는 않습니다.

현재 디렉토리(폴더) 이동 예제: _chdir() Function Example

소스 파일명: 0.cpp
#include <stdio.h>
#include <stdlib.h>  // exit(), _MAX_PATH
#include <direct.h>  // _chdir()
#include <errno.h>

int main(void) {
  // 이동할 디렉토리명
  char s[] = "D:/Program Files";

  // 현재 디렉토리명 출력용 버퍼
  char currentPath[_MAX_PATH];

  // 프로그램 시작
  printf("현재 디렉토리: %s\n", _getcwd(currentPath, _MAX_PATH));

  if (_chdir(s)) {
    switch (errno) {
      case ENOENT:
        fprintf(stderr, "Unable to locate the directory: %s\n", s); break;
      case EINVAL:
        fprintf(stderr, "Invalid buffer.\n"); break;
      default:
        fprintf(stderr, "Unknown error.\n");
    }
    exit(1); // 에러 나면 프로그램 강제 종료
  }

  printf("변경 후 현재 디렉토리: %s\n", _getcwd(currentPath, _MAX_PATH));

  return 0;
}


"D:\Program Files"
이런 디렉토리를 문자열 상수(리터럴)로 표현하기 위해서는
"D:\\Program Files"
이렇게 백슬래쉬(\)를 이중으로 하여 이스케이프하든지,
"D:/Program Files"
또는 이렇게 유닉스 스타일의 패스로 기입합니다. (윈도우에서도 슬래쉬(/)를 패스 구분자로 쓸 수 있습니다.)

그렇지 않으면 D:\Pro... 에서 'P' 라는 평범한 글자를 이스케이프 시퀀스로 오인하여 다음과 같은 경고가 나오고 에러가 납니다: warning C4129: 'P' : unrecognized character escape sequence


그리고 디렉토리명 끝부분에 백슬래쉬를 붙이는 경우
"D:\\Program Files\"
이렇게 1개만 붙이면
error C2001: newline in constant
그리고
error C2144: syntax error : 'char' should be preceded by ';'
이런 에러가 납니다.

_chdir() 은 성공했을 때는 0, 실패했을 때는 -1을 반환합니다.

디렉토리 변경에 실패했을 때에는 다음과 같은 에러를 출력합니다:

Unable to locate the directory: D:/XYZ000
"그런 디렉토리로 이동할 수 없다"는 에러 (하드에 D:/XYZ000 라는 디렉토리가 없을 경우)

Invalid buffer.
는 디렉토리명이 빈 문자열이거나 잘못되었다는 에러

Unknown error.
그밖의 알 수 없는 기타 에러

위의 예제 소스 컴파일 및 실행 결과:
(현재 디렉토리가 D:\Z 인 상태임)
D:\Z>cl 0.cpp && 0.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:0.exe
0.obj
현재 디렉토리: D:\Z
변경 후 현재 디렉토리: D:\Program Files

D:\Z>

참고로 위의 예제 소스에서, 디렉토리 변경에 실패했을 때에는 exit(1) 이렇게 프로그램을 종료하도록 했는데, 대부분의 경우, 디렉토리 변경 실패는 치명적인 에러가 아니므로 종료할 필요까지는 없습니다. 실제 프로그램에서는 exit(1)... 행을 지우고, 실패했을 때 실행할 적당한 코드를 작성해 주는 것이 좋습니다.

Visual C++ 2005 버전부터는 chdir() 대신에, _chdir() 을 사용해야 합니다.


반응형