본문 바로가기

Programing

드라이브명으로 볼륨명 구하기

우리는 흔히 디스크 드라이브 명이 C나 D 같이 단일 문자로 되어 있다고 생각할지 모르지만

윈도우는 내부적으로 UNC(universal naming convention)를 따라서 사용한다.

이 UNC는 "\\?\"를 접두어로 사용한다. 더 자세한 내용은 MSDN의 Naming Files, Paths, and Namespaces를 참고!


이 글은 네이버 지식iN에 올라왔던 "볼륨명으로 드라이브번호 알아내는법..."라는 질문으로 시작되었다.

 => http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=157619577



내가 만든 코드 (GetVolNameByDriverName)

 : 입력 - 단일 드라이브 명. 예) C

 : 출력 - UNC이름. 예) \\?\Volume{c51cfc1f-7025-11e1-b23a-806d6172696f}\


#include <windows.h>

#include <tchar.h>

#include <stdio.h>

 

BOOL

GetVolNameByDriverName(

    __in TCHAR drive,

    __out_ecount(cchBufferLength) LPTSTR lpszVolumeName,

    __in DWORD cchBufferLength);

 

void _tmain(int argc, TCHAR *argv[])

{

        TCHAR volName[MAX_PATH];

        BOOL bSuccess = GetVolNameByDriverName(TEXT('C'), volName, MAX_PATH);

        if(bSuccess) _tprintf(TEXT("%s\n"), volName);

        else _tprintf(TEXT("Error : %d\n"), GetLastError());

}

 

// If the function succeeds, the return value is nonzero.

BOOL GetVolNameByDriverName(TCHAR drive, LPTSTR lpszVolumeName, DWORD cchBufferLength)

{

        TCHAR szVolumeMountPoint[3+1];

        wsprintf(szVolumeMountPoint, TEXT("%c:\\"), drive);

        return GetVolumeNameForVolumeMountPoint(szVolumeMountPoint, lpszVolumeName, cchBufferLength);

}


순전히 윈도우 API 함수 GetVolumeNameForVolumeMountPoint를 래핑한 것에 불과하다.

이 함수의 첫 번째 인자인 볼륨 마운트 포인트는 "X:\"와 같이 역슬래쉬('\')로 끝나야 한다는 조건이 있기에 실수를 줄여줄 수 있는 래퍼 함수인 것이다.


참고: Enumdisk1.exe: Enumdisk Sample for Enumerating Disk Devices
 MSDN::SetupDiGetDeviceRegistryProperty function


'Programing' 카테고리의 다른 글

개발도구 - 이슈관리, CI  (0) 2013.01.29
Zen Coding  (0) 2012.10.28
그래프 그리기  (0) 2012.10.15
Comet 부하테스트  (0) 2012.09.21
Comet 서블릿 처리하기  (0) 2012.09.21