_getdiskfree
Populates a _diskfree_t structure with information about a disk drive.
unsigned _getdiskfree( unsigned drive, struct _diskfree_t * driveinfo );
Parameters
- [in] drive
-
The disk drive for which you want information.
- [out] driveinfo
-
A _diskfree_t structure that will be populated with information about the drive.
If the function succeeds, the return value is zero. If the function fails, the return value is the error code. The value errno is set for any errors returned by the operating system. For more information about error conditions indicated by errno, see errno.
The _diskfree_t structure is defined in Direct.h.
struct _diskfree_t {
unsigned total_clusters;
unsigned avail_clusters;
unsigned sectors_per_cluster;
unsigned bytes_per_sector;
};
This function validates its parameters. If the driveinfo pointer is NULL or drive specifies an invalid drive, this function invokes an invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, the function returns EINVAL and sets errno to EINVAL. Valid drives range from 0 to 26. A drive value of 0 specifies the current drive; thereafter, numbers map onto letters of the English alphabet, so 1 indicates drive A, 3 indicates drive C, and so on.
- total_clusters
-
The total number of clusters, used and available, on the disk.
- avail_clusters
-
The number of unused clusters on the disk.
- sectors_per_cluster
-
The number of sectors in each cluster.
- bytes_per_sector
-
The size of each sector in bytes.
| Routine | Required header | Compatibility |
|---|---|---|
| _getdiskfree | <direct.h> | Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 |
For more compatibility information, see Compatibility in the Introduction.
// crt_getdiskfree.c
// compile with: /c
#include <windows.h>
#include <direct.h>
#include <stdio.h>
#include <tchar.h>
TCHAR g_szBorder[] = _T("======================================================================\n");
TCHAR g_szTitle1[] = _T("|DRIVE|TOTAL CLUSTERS|AVAIL CLUSTERS|SECTORS / CLUSTER|BYTES / SECTOR|\n");
TCHAR g_szTitle2[] = _T("|=====|==============|==============|=================|==============|\n");
TCHAR g_szLine[] = _T("| A: | | | | |\n");
void utoiRightJustified(TCHAR* szLeft, TCHAR* szRight, unsigned uVal);
int main(int argc, char* argv[]) {
TCHAR szMsg[4200];
struct _diskfree_t df = {0};
ULONG uDriveMask = _getdrives();
unsigned uErr, uLen, uDrive;
printf(g_szBorder);
printf(g_szTitle1);
printf(g_szTitle2);
for (uDrive=1; uDrive<=26; ++uDrive) {
if (uDriveMask & 1) {
uErr = _getdiskfree(uDrive, &df);
memcpy(szMsg, g_szLine, sizeof(g_szLine));
szMsg[3] = uDrive + 'A' - 1;
if (uErr == 0) {
utoiRightJustified(szMsg+8, szMsg+19, df.total_clusters);
utoiRightJustified(szMsg+23, szMsg+34, df.avail_clusters);
utoiRightJustified(szMsg+38, szMsg+52, df.sectors_per_cluster);
utoiRightJustified(szMsg+56, szMsg+67, df.bytes_per_sector);
}
else {
uLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL,
uErr, 0, szMsg+8, 4100, NULL);
szMsg[uLen+6] = ' ';
szMsg[uLen+7] = ' ';
szMsg[uLen+8] = ' ';
}
printf(szMsg);
}
uDriveMask >>= 1;
}
printf(g_szBorder);
}
void utoiRightJustified(TCHAR* szLeft, TCHAR* szRight, unsigned uVal) {
TCHAR* szCur = szRight;
int nComma = 0;
if (uVal) {
while (uVal && (szCur >= szLeft)) {
if (nComma == 3) {
*szCur = ',';
nComma = 0;
}
else {
*szCur = (uVal % 10) | 0x30;
uVal /= 10;
++nComma;
}
--szCur;
}
}
else {
*szCur = '0';
--szCur;
}
if (uVal) {
szCur = szLeft;
while (szCur <= szRight) {
*szCur = '*';
++szCur;
}
}
}
Sample Output
====================================================================== |DRIVE|TOTAL CLUSTERS|AVAIL CLUSTERS|SECTORS / CLUSTER|BYTES / SECTOR| |=====|==============|==============|=================|==============| | A: | The device is not ready. | | | | C: | 4,721,093 | 3,778,303 | 8 | 512 | | D: | 1,956,097 | 1,800,761 | 8 | 512 | | E: | The device is not ready. | | | ======================================================================
Not applicable. To call the standard C function, use PInvoke. For more information, see Platform Invoke Examples.