표준 검색경로 검색 순서
1. 실행 중인 프로세스의 실행파일이 존재하는 디렉토리
2. 실행 중인 프로세스의 현재 디렉토리 (Current Directory)
3. Windows 시스템 디렉토리 (System Directory)
4. Windows 디렉토리 (Windows Directory)
5. 환경변수 PATH 에 의해 지정되어 있는 디렉토리
Windows 에서는 현재 디렉토리 개념을 제공한다
현재 디렉토리 (Current Directory) 는 특정 파일을 찾을 경우 기본이 되는 디렉토리로,
완전 경로 (Full Path) 를 전달하지 않는 경우 현재 디렉토리를 기준으로 작업이 이루어진다
일반적으로 프로세스 생성 시 프로세스의 현재 디렉토리는
프로세스 실행 파일이 존재하는 디렉토리로 설정된다
실행 중인 프로세스의 현재 디렉토리를 확인하고 변경할 수 있고,
Windows 시스템 디렉토리와 Windows 디렉토리도 확인할 수 있다
현재 디렉토리 확인
DWORD GetCurrentDirectory(
[in] DWORD nBufferLength,
[out] LPTSTR lpBuffer
);
문자열 버퍼의 길이 (일반적으로 MAX_PATH) 와
현재 디렉토리를 수신할 문자열 버퍼의 주소값을 전달한다
실패하면 0 을, 성공하면 문자열의 길이를 반환한다
버퍼 크기가 작을 경우 필요한 버퍼의 크기를 반환한다
실패 시 GetLastError 함수를 통해 에러코드를 확인할 수 있다
현재 디렉토리 변경
BOOL SetCurrentDirectory(
[in] LPCTSTR lpPathName
);
변경할 현재 디렉토리 경로를 상대 경로 또는 전체 경로로 전달한다
두 경우 모두 지정된 디렉토리의 전체 경로가 계산되고 현재 디렉토리로 설정된다
실패하면 0 을, 성공하면 0 이 아닌 값을 반환한다
실패 시 GetLastError 함수를 통해 에러코드를 확인할 수 있다
NULL 문자 앞의 마지막 문자는 백슬래시 ('\') 여야 한다 (아니라면 백슬래시가 추가된다)
따라서 마지막 백슬래시와 NULL 문자를 포함한 최대 길이는 MAX_PATH 이다
시스템 디렉토리 확인
UINT GetSystemDirectory(
[out] LPTSTR lpBuffer,
[in] UINT uSize
);
시스템 디렉토리를 수신할 문자열 버퍼의 주소값과
문자열 버퍼의 길이 (일반적으로 MAX_PATH) 를 전달한다
실패하면 0 을, 성공하면 문자열의 길이를 반환한다
버퍼 크기가 작을 경우 필요한 버퍼의 크기를 반환한다
실패 시 GetLastError 함수를 통해 에러코드를 확인할 수 있다
sysinfoapi.h 헤더는 GetSystemDirectory 를 유니코드 전처리기 상수의 정의에 따라,
이 함수의 ANSI 또는 UNICODE 버전을 자동으로 선택하는 별칭으로 정의한다
(ANSI : GetSystemDirectoryA / UNICODE : GetSystemDirectoryW)
Windows 디렉토리 확인
UINT GetWindowsDirectory(
[out] LPTSTR lpBuffer,
[in] UINT uSize
);
Windows 디렉토리를 수신할 문자열 버퍼의 주소값과
문자열 버퍼의 길이 (일반적으로 MAX_PATH) 를 전달한다
실패하면 0 을, 성공하면 문자열의 길이를 반환한다
버퍼 크기가 작을 경우 필요한 버퍼의 크기를 반환한다
실패 시 GetLastError 함수를 통해 에러코드를 확인할 수 있다
sysinfoapi.h 헤더는 GetWindowsDirectory 를 유니코드 전처리기 상수의 정의에 따라,
이 함수의 ANSI 또는 UNICODE 버전을 자동으로 선택하는 별칭으로 정의한다
(ANSI : GetWindowsDirectoryA / UNICODE : GetWindowsDirectoryW)
사용 예시 (코드 링크)
// Directory
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
int _tmain(void)
{
TCHAR CurrentDirectory[MAX_PATH];
TCHAR SystemDirectory[MAX_PATH];
TCHAR WindowsDirectory[MAX_PATH];
GetCurrentDirectory(MAX_PATH, CurrentDirectory);
_tprintf(_T("%s\n"), CurrentDirectory);
SetCurrentDirectory(_T("C:\\Users"));
GetCurrentDirectory(MAX_PATH, CurrentDirectory);
GetSystemDirectory(SystemDirectory, MAX_PATH);
GetWindowsDirectory(WindowsDirectory, MAX_PATH);
_tprintf(_T("%s\n"), CurrentDirectory);
_tprintf(_T("%s\n"), SystemDirectory);
_tprintf(_T("%s\n"), WindowsDirectory);
return 0;
}
참고 자료
https://learn.microsoft.com/ko-kr/windows/win32/api/winbase/nf-winbase-getcurrentdirectory
https://learn.microsoft.com/ko-kr/windows/win32/api/winbase/nf-winbase-setcurrentdirectory
https://learn.microsoft.com/ko-kr/windows/win32/fileio/maximum-file-path-limitation?tabs=registry
https://learn.microsoft.com/ko-kr/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemdirectorya
https://learn.microsoft.com/ko-kr/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemdirectoryw
https://learn.microsoft.com/ko-kr/windows/win32/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectorya
https://learn.microsoft.com/ko-kr/windows/win32/api/sysinfoapi/nf-sysinfoapi-getwindowsdirectoryw
https://www.youtube.com/playlist?list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc
'Windows' 카테고리의 다른 글
메일 슬롯 방식 IPC (0) | 2024.05.07 |
---|---|
커널 오브젝트와 핸들 (0) | 2024.04.26 |
프로세스 생성 (0) | 2024.04.10 |
오류 확인 (0) | 2024.04.09 |
64비트 기반 프로그래밍 (0) | 2024.04.03 |