본문 바로가기
컴퓨터/MFC_API

프로그램이 플로피 디스크를 읽는 것 방지

by adnoctum 2009. 12. 27.
   컴퓨터에 있는 드라이브를 전부 나열하는 프로그램들은 종종 각 드라이브에 있는 가장 첫번째 디렉토리 읽기를 시도한다. 이럴 경우 플로피 디스크 드라이브에까지 이와 같은 시도를 하는 프로그램을 구동시키면 '끅!' 과 같은 소리가 나고 플로피 디스크를 읽기 시도한다. 이와 같은 일을 피할 수 있는 방법은 매우 간단한다. 즉,

// 사용중인 모든 드라이브 문자열을 얻어 간다.
DWORD logicalDrives = GetLogicalDrives();
unsigned int i = 0;
do{
    // 사용중인 드라이브 문자열 각각에 대하여
    if((logicalDrives & 1) != 0){
        CString strDrive = "";
        // 문자열을 setting 한다.
        strDrive.Format("%c:\\",i+65);
        // 드라이브 타입을 확인한다.
        UINT driveType = GetDriveType(strDrive);
 
        SHFILEINFO sfi = { 0 };
        SHGetFileInfo(strDrive, 0, &sfi, sizeof(sfi), SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX);
        if(child_node_name.count(sfi.szDisplayName) == 0){
            HTREEITEM hItem = InsertItem(sfi.szDisplayName, sfi.iIcon, sfi.iIcon, hParentItem);
            CString subfolder;
            // CD-ROM이나 floppy disk는 제외
            if(driveType == DRIVE_REMOVABLE || driveType == DRIVE_CDROM) continue;
            // 이 부분에서 아마도 각 드라이브를 읽는 작업이 진행될 것이다.
            // 이 코드의 경우, GetFirstSubfolderName 함수가 그 일을 한다.
            if(GetFirstSubfolderName(strDrive,&subfolder) == true){
                SHGetFileInfo(strDrive+subfolder, 0, &sfi, sizeof(sfi), SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX);
                InsertItem(subfolder, sfi.iIcon, sfi.iIcon, hItem);
            }
        }
    }
    i++;
}while((logicalDrives >>= 1) != 0);

GetLogicalDrives 함수는 드라이브 문자 A 부터 시작해서 Z 까지에 대해, 존재하는 드라이브 문자의 알파벳 순서에 해당하는 bit 가 1 로 설정된 DWORD 값을 반환해 준다. 즉, C 드라이브가 존재하면 세 번째 bit 가 1 일 것이다.

위 코드의 제일 마지막 줄의 while 문이 조금 혼동될 수 있는데, bit 를 오른쪽으로 shift 시킨 값이 0 이라는 것은 모든 bit가 0 이란 얘기이고, 따라서 더이상 드라이브 문자가 없다는 얘기. 그러므로 그 때 끝마치면 된다.

위 코드는 존재하는 모든 드라이브에 대해 각 드라이브의 타입을 GetDriveType 함수로 얻어 오고 있다. 이 함수는 미리 설정된 값을 반환해 주며, 각각 어떤 값이 있는지는 MSDN 을 참고한다.


위 코드의 파란 배경 글씨 부분과 같이 drive type을 확인하고 적당히 처리해 주면 된다.