Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 현재 작업 디렉터리 경로 구하는 방법

C/C++에서 현재 작업 디렉터리 구하기

이 글에서는 C 또는 C++ 프로그램에서 현재 작업 디렉터리(Current Working Directory), 즉 프로그램이 실행되고 있는 디렉터리의 전체 경로를 얻는 방법을 살펴보겠습니다.

현재 작업 디렉터리를 가져오는 함수는 운영체제마다 다릅니다. Windows 계열에서는 <direct.h> 헤더에 정의된 _getcwd() 함수를 사용하고, Linux나 macOS 같은 UNIX 계열 시스템에서는 <unistd.h> 헤더에 정의된 getcwd() 함수를 사용합니다.

따라서 하나의 소스 코드로 여러 플랫폼을 지원하려면 전처리기(Preprocessor) 조건문을 활용해 컴파일 시점에 적절한 함수를 선택하도록 만들어야 합니다. 아래 예제 코드가 바로 그 방식입니다.

예제 코드

#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

#include<iostream>
using namespace std;

std::string get_current_dir() {
    char buff[FILENAME_MAX]; // 경로를 담을 문자열 버퍼 생성
    GetCurrentDir(buff, FILENAME_MAX);
    string current_working_dir(buff);
    return current_working_dir;
}

main() {
    cout << get_current_dir() << endl;
}

코드 설명

  • #ifdef WINDOWS / #else: Windows 환경에서 컴파일될 경우 _getcwd를, 그 외의 환경(UNIX/Linux/macOS)에서는 getcwdGetCurrentDir이라는 매크로로 정의합니다. 이렇게 하면 호출부 코드는 플랫폼에 상관없이 동일하게 유지됩니다.
  • char buff[FILENAME_MAX]: 경로 문자열을 저장할 버퍼입니다. FILENAME_MAX는 표준 헤더에서 제공하는 상수로, 파일 경로가 가질 수 있는 최대 길이를 보장합니다.
  • GetCurrentDir(buff, FILENAME_MAX): 현재 작업 디렉터리의 전체 경로를 버퍼에 복사합니다.
  • string current_working_dir(buff): char 배열을 std::string으로 변환해 반환함으로써, 호출자가 메모리 관리 부담 없이 안전하게 경로를 사용할 수 있게 합니다.

실행 결과

D:\C++ Programs\section 53

프로그램이 실행된 위치에 따라 출력 결과는 달라집니다. 위 예제에서는 D:\C++ Programs\section 53 디렉터리에서 실행되었기 때문에 해당 경로가 그대로 출력된 것입니다.

참고로 C++17 이상을 사용하는 환경이라면 <filesystem> 헤더의 std::filesystem::current_path()를 이용하는 것이 더 현대적이고 이식성 좋은 방법이므로, 가능하다면 함께 고려해 보시기 바랍니다.