// 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;
   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 = 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 = ' ';
            szMsg = ' ';
            szMsg = ' ';
         }
         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;
      }
   }
}
结果如下,中间未提示错误信息,这样就好
======================================================================
|DRIVE|TOTAL CLUSTERS|AVAIL CLUSTERS|SECTORS / CLUSTER|BYTES / SECTOR|
|=====|==============|==============|=================|==============|
| C: | 7,681,070 | 5,276,989 | 8 | 512 |
| D: | 23,041,218 | 18,417,512 | 8 | 512 |
| E: | 23,041,218 | 16,398,257 | 8 | 512 |
| F: | 21,818,270 | 2,858,339 | 8 | 512 |
| G: | 2,560,351 | 2,543,733 | 8 | 512 |
| H: | 设备未就绪。 | | |
| I: | 设备未就绪。 | | |
======================================================================