컴퓨터에 있는 드라이브를 전부 나열하는 프로그램들은 종종 각 드라이브에 있는 가장 첫번째 디렉토리 읽기를 시도한다. 이럴 경우
플로피 디스크 드라이브에까지 이와 같은 시도를 하는 프로그램을 구동시키면 '끅!' 과 같은 소리가 나고 플로피 디스크를
읽기 시도한다. 이와 같은 일을 피할 수 있는 방법은 매우 간단한다. 즉,
GetLogicalDrives 함수는 드라이브 문자 A 부터 시작해서 Z 까지에 대해, 존재하는 드라이브 문자의 알파벳 순서에 해당하는 bit 가 1 로 설정된 DWORD 값을 반환해 준다. 즉, C 드라이브가 존재하면 세 번째 bit 가 1 일 것이다.
위 코드의 제일 마지막 줄의 while 문이 조금 혼동될 수 있는데, bit 를 오른쪽으로 shift 시킨 값이 0 이라는 것은 모든 bit가 0 이란 얘기이고, 따라서 더이상 드라이브 문자가 없다는 얘기. 그러므로 그 때 끝마치면 된다.
위 코드는 존재하는 모든 드라이브에 대해 각 드라이브의 타입을 GetDriveType 함수로 얻어 오고 있다. 이 함수는 미리 설정된 값을 반환해 주며, 각각 어떤 값이 있는지는 MSDN 을 참고한다.
위 코드의 파란 배경 글씨 부분과 같이 drive type을 확인하고 적당히 처리해 주면 된다.
// 사용중인 모든 드라이브 문자열을 얻어 간다.
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);
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을 확인하고 적당히 처리해 주면 된다.
'컴퓨터 > MFC_API' 카테고리의 다른 글
Resize ScrollView (0) | 2009.12.27 |
---|---|
CTreeCtrl 에서 check box를 집어 넣고 다루기 (1) | 2009.12.27 |
Scrollbar message handler 처리하기 (0) | 2009.12.27 |
저장하기 대화 상자 열기 (0) | 2009.12.14 |
클립보드(clipboard) 내용 가져오기 (0) | 2009.12.09 |