[C언어/C++] HDD, SSD 드라이브 목록 & 용량 구하기 : _chdrive, GetDiskFreeSpaceEx functions example)
안녕하세요 JollyTree입니다 (•̀ᴗ•́)و
_chdrive(int drive) 함수는 현재의 드라이브를 변경하는 함수입니다. 파라미터인 int drive는 1에서부터 26까지의 정수로 1은 A 드라이브, 2는 B 드라이브, 3은 C 드라이브 등을 의미하며 정상적으로 드라이브가 변경되면 0을 리턴합니다. 아래 예제는 이런 _chdrive() 함수의 특성을 이용하여 컴퓨터에 장착된 HDD(Hard Disk Drive, 하드디스크), SSD(Solid-State Drive)에서 사용 가능한 드라이브 목록을 구합니다.
사용 가능한 드라이브들을 구해서 driveArrary[30] 배열에 저장한 후 driveArrary[30]에 저장된 드라이브 letter를 driveInfo() 함수에 파라미터로 전달하여 디스크 용량을 구하는데 사용합니다.
🔗 사용 중인 드라이브 목록 & 용량 구하기 예제(Example):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include <stdio.h>
#include <direct.h> //_getdrive, _chdrive
#include <windows.h> //GetDiskFreeSpaceEx
#define CALCUL_MB (1024 * 1024)
#define CALCUL_GB (1024 * 1024 * 1024)
typedef struct _drive_info
{
unsigned __int64 freeBytesToCaller;
unsigned __int64 totoalFreeBytes;
unsigned __int64 freeBytes;
}DRIVE_INFO;
int driveInfo(char *dirve, DRIVE_INFO &info)
{
BOOL r;
unsigned __int64 freeBytesToCaller;
unsigned __int64 totoalFreeBytes;
unsigned __int64 freeBytes;
r = GetDiskFreeSpaceEx(dirve,
(PULARGE_INTEGER)&freeBytesToCaller,
(PULARGE_INTEGER)&totoalFreeBytes,
(PULARGE_INTEGER)&freeBytes);
if (r==0)
return -1;
info.freeBytesToCaller = freeBytesToCaller;
info.totoalFreeBytes = totoalFreeBytes;
info.freeBytes = freeBytes;
return 0;
}
int main(void)
{
char dirveArrary[30] = "";
int driveCount = 0, i = 0, driveBackup = 0;
unsigned __int64 usedBytes = 0;
DRIVE_INFO info;
char buf[50] = "";
driveBackup = _getdrive();
printf("\n >> 사용 가능한 드라이브 목록: \n");
//A(1) ~ Z(26) 까지 순차적으로 검색
for (i = 1; i <= 26; i++)
{
if (_chdrive(i) == 0)
{
printf(" >> %c: \n", i + 'A' - 1);
dirveArrary[driveCount] = i + 'A' - 1;
driveCount++;
}
}
_chdrive(driveBackup);
printf(" >> 총 %d 개의 사용 가능한 드라이브가 있습니다.\n\n", driveCount);
for (i = 0; i < driveCount; i++)
{
printf(" >> ------------------------------------------\n");
printf(" >> #%d: [%C:] 드라이브 용량 정보 보기:\n", i+1, dirveArrary[i]);
printf(" >> ------------------------------------------\n");
sprintf(buf, "%C:", dirveArrary[i]);
if (driveInfo(buf, info) == 0)
{
usedBytes = info.totoalFreeBytes - info.freeBytes;
printf(" >> 사용 중인 공간 : %10I64uMB (%6.0fGB)\n",
usedBytes / CALCUL_MB, (double)usedBytes / CALCUL_GB);
printf(" >> 사용 가능한 공간 : %10I64uMB (%6.0fGB)\n",
info.freeBytes / CALCUL_MB, (double)info.freeBytes / CALCUL_GB);
printf(" >> 전체 용량 : %10I64uMB (%6.0fGB)\n\n",
info.totoalFreeBytes / CALCUL_MB, (double)info.totoalFreeBytes / CALCUL_GB);
printf("\n");
}
}
return 0;
}
|
cs |
🔗 실행결과(Output):
>> 사용 가능한 드라이브 목록: >> C: >> D: >> 총 2 개의 사용 가능한 드라이브가 있습니다. >> ------------------------------------------ >> #1: [C:] 드라이브 용량 정보 보기: >> ------------------------------------------ >> 사용 중인 공간 : 335316MB ( 327GB) >> 사용 가능한 공간 : 641154MB ( 626GB) >> 전체 용량 : 976470MB ( 954GB) >> ------------------------------------------ >> #2: [D:] 드라이브 용량 정보 보기: >> ------------------------------------------ >> 사용 중인 공간 : 1409422MB ( 1376GB) >> 사용 가능한 공간 : 590577MB ( 577GB) >> 전체 용량 : 1999999MB ( 1953GB) |
이상 JollyTree였습니다. (•̀ᴗ•́)و