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)에서는getcwd를GetCurrentDir이라는 매크로로 정의합니다. 이렇게 하면 호출부 코드는 플랫폼에 상관없이 동일하게 유지됩니다. - 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()를 이용하는 것이 더 현대적이고 이식성 좋은 방법이므로, 가능하다면 함께 고려해 보시기 바랍니다.