Coding & Programming/C, C++

[C언어/C++] HDD, SSD 드라이브 목록 & 용량 구하기(_chdrive, GetDiskFreeSpaceEx functions example)

mainCodes 2021. 5. 8. 09:07

[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였습니다. (•̀ᴗ•́)و