Поделиться через


_getdiskfree

Использует сведения о диске для заполнения структуры _diskfree_t.

Важно!

Этот API не может использоваться в приложениях, выполняемых в Среда выполнения Windows.Дополнительные сведения см. в статье Функции CRT, которые не поддерживаются с ключом /ZW.

unsigned _getdiskfree(
   unsigned drive,
   struct _diskfree_t * driveinfo
);

Параметры

  • [входящий] drive
    Диск, для которого требуется сведения.

  • [исходящий] driveinfo
    Структура _diskfree_t, которая будет заполнена сведениями о диске.

Возвращаемое значение

Если вызов функции заканчивается удачно, возвращается значение ноль. Если функция завершается с ошибкой, возвращается значение кода ошибки. Значение errno установлено для всех ошибок, возвращаемых операционной системой. Дополнительные сведения об условиях возникновения ошибок, отображаемых errno, см. в разделе Константы errno.

Заметки

Структура _diskfree_t определена в Direct.h.

struct _diskfree_t { 
   unsigned total_clusters; 
   unsigned avail_clusters; 
   unsigned sectors_per_cluster; 
   unsigned bytes_per_sector; 
};

Эта функция проверяет свои параметры. Если указатель driveinfo имеет значение NULL или drive определяет недопустимый диск, эта функция вызывает обработчик недопустимых параметров, как описано в разделе Проверка параметров. Если выполнение разрешено для продолжить, функция возвращает EINVAL и задает errno в EINVAL. Допустимые диски: от 0 до 26. Значение drive, равное 0, означает текущий диск; таким образом, числа сопоставляются с буквами английского алфавита так, что 1 указывает на диск А, 3 — на диск C и т. д.

  • total_clusters
    Общее количество кластеров, используемых и доступных, на диске.

  • avail_clusters
    Число неиспользуемых кластеров на диске.

  • sectors_per_cluster
    Число участков в каждом кластере.

  • bytes_per_sector
    Размер в байтах каждого сектора.

Требования

Подпрограмма

Обязательный заголовок

_getdiskfree

<direct.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// 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;
      }
   }
}
  

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Для получения дополнительной информации см. Примеры вызовов неуправляемого кода.

См. также

Ссылки

Управление каталогами