[WinAPI] 로컬 디스크 – 1. 로컬 디스크 목록 얻기(GetLogicalDriveStrings)

로컬 디스크 관련하여, 이번 글에서는 로컬 디스크 목록 얻는 방법에 대해 알아보겠습니다.

로컬 디스크는 내PC 폴더에서 볼 수 있으며 아래와 같이 C:\, D:\ 경로를 가집니다.

USB를 꽂거나 하드를 계속 확장하게 되면 E:\, F:\, … 로 계속 늘어 나게 됩니다.
이 목록을 GetLogicalDriveStrings함수를 사용하여 얻어보겠습니다.

함수 원형은 아래와 같습니다.

// 문자열 길이 반환
DWORD GetLogicalDriveStringsW(
	DWORD nBufferLength, // 버퍼 길이
    LPWSTR lpBuffer // 버퍼
);

함수가 실패하면 0을 반환하고 GetLastError를 통해 확인 가능합니다.
함수가 성공하면 반환되는 문자열의 길이를 반환합니다. 만약 버퍼가 충분히 크지 않으면 nBufferLength보다 큰 값이 반환 됩니다.
반환되는 버퍼에는 로컬디스크 명칭이 모두 담겨져 있고, 널문자열(\0)으로 구분되어 있습니다.
만약 C, D, E 드라이브가 존재하면  “C:\\\0D:\\\0E:\\\0“가 반환됩니다.

코드로 보면 아래와 같습니다.

DWORD dwError = 0;
TCHAR tzDriveString[MAX_PATH] = {0, };

// 반환 예 : "C:\\\0D:\\\0E:\\\0\0"
// 구분 : "\0", 끝 : "\0\0"
DWORD dwStringsLen = ::GetLogicalDriveStrings(MAX_PATH, tzDriveString); // 로컬 디스크 목록 얻기
if (dwStringsLen != 0 && dwStringsLen <= MAX_PATH)
{
	CString strTrace;
	strTrace.Format(_T("Length : %lu"), dwStringsLen);
	TRACE(_T("%s\n"), strTrace);

	DWORD dwIndex = 0;
	while (0 < _tcslen(&tzDriveString[dwIndex]))
	{
		strTrace.Format(_T("Drive : %s"), &tzDriveString[dwIndex]);
		TRACE(_T("%s\n"), strTrace);
        
		dwIndex += _tcslen(&tzDriveString[dwIndex]) + 1;
	}
}
else
	dwError = ::GetLastError();

if (dwError != 0)
{
	// 에러 처리
}

return;

다음 글에서는 이렇게 얻어온 로컬 디스크의 정보를 알아보도록 하겠습니다.