'드라이브'에 해당되는 글 1건

  1. 2006.08.21 현재 시스템의 드라이브 정보 얻기 1



예제 프로그램
실제 드라이브 목록

현재 시스템의 드라이브 정보를 얻기 위해서 GetLogicalDrives()라는 함수를 사용한다...
이 함수를 사용하면 DWORD형으로 값을 리턴해주는데 각각의 비트마다 해당 드라이브의 존재유무를 2진수로 알려준다.

기본적으로 아래와 같이 초기화를 해준다.
int m_nDrivePos = 0;
CString m_strDrive = "?:\\";
DWORD dwDriveList = ::GetLogicalDrives();

각각의 변수의 의미는 m_nDrivePos는 "a, c, d, e" 등 드라이브의 실제 이름을 정해줄때 아스키값 이용해서 사용할 변수이다...
m_strDrive는 "a:\", "c:\"와 같이 드라이브명을 지어주기 위해 사용한다...
위의 두 변수는 GetLogicalDrives() 함수는 현 시스템의 드라이브 정보를 2진수로만 알려주기 때문에 이것을 적절히 변경하여 알아보기 쉽게 바꾸기 위해서 사용한다.
마지막으로 dwDriveList는 GetLogicalDrives() 함수를 이용 실제로 드라이브 정보를 얻어오는 부분이다...2진수가 들어간다.

이렇게 얻어온 정보를 아래의 소스를 이용해서 실제적인 현 시스템의 드라이브명을 얻을수 있다
while(dwDriveList)
{
    // DWORD형으로 넘어온 값 하나씩 '&' 연산으로 드라이브 존재 유무 판단
    if(dwDriveList & 1)  
    {
         // "C:\"과 같이 드라이브를 표시하는 문자열로 만듦
         // ‘A' 값 기준으로 아스키코드 값 이용
         m_strDrive.SetAt(0,'A'+m_nDrivePos);
    }

    // 우로 1비트 이동(= 다음 드라이브 체크)
    dwDriveList >>= 1;
    m_nDrivePos++;
}

위의 소스를 설명하기 전에 dwDriveList의 값이 어떻게 설정되어 있는지 알아보면 다음과 같다.
예를 들어 현재 시스템에 드라이브가  "A, C, D, E" 가 존재한다고 하면 dwDriveList의 값은 11101이 된다.
이것을 좀더 분석해보면 저 수치를 오른쪽부터 읽어들이면 된다...
즉 오른쪽부터 "A, B, C, D, E" 드라이브의 존재 유무를 표시해준다...
값은 0이면 드라이브가 없음을...1이면 드라이브가 존재함을 의미한다...
즉 가장 오른쪽 값은 A드라이브의 존재유무를 알려주는데 값이 1로 설정되있으므로 현 시스템에는 A 드라이브가 있음을 알려준다.

이제 다시 소스 부분으로 돌아가서 분석하면...
일단 while 문에 dwDriveList를 넣었다....dwDriveList 를 계속 비트연산하다보면 결국에는 0이 된다...즉 루프탈출 조건은 모든 드라이브 목록을 구하면이다...

그 다음에 if 문을 보면 값 1을 가지고 "&연산"을 한다...
1로 "&연산"을 하면 피연산자가 1이면 1을 리턴하고 0이면 0을 리턴한다...
즉 if문의 조건이 참이라면 해당되는 곳은 드라이브가 존재한다는 뜻이다...
일단 1로 계산을 했으므로 앞에는 모두 0으로 계산하므로 가장 뒷자리만 계산을 한다...

위의 "11101"을 가지고 예를 들면....첫 반복문에서는 "11101 & 00001 = 1"이라는 결과가 나오므로 현 시스템에서 A드라이브가 존재함을 알수 있다.
그 다음에는 단순히 'A' 문자부터 시작하는 아스키 값을 이용해서 "A:\" -> 이런 형식으로 문자열을 바꿔준다...

이렇게하면 하나의 드라이브 목록을 구하는데 다음 드라이브 목록을 구하기 위해서 비트를 한단계 이동 시킨다...
그러면 11101 이라는 값이 1110으로 변경되므로 다음에는 1110이랑 1이랑 & 연산을 시켜서 드라이브 유무를 판단한다...

이런식으로 현 시스템의 모든 드라이브 목록을 얻고 원하는 형식으로 드라이브명을 변경시켜줘서 사용할 수 있다.

(사용언어 및 제작툴 : MFC / VS2003)

Posted by Gungume
,