_getdiskfree
更新 : 2007 年 11 月
ディスク ドライブに関する情報を _diskfree_t 構造体に代入します。
unsigned _getdiskfree(
unsigned drive,
struct _diskfree_t * driveinfo
);
パラメータ
[入力] drive
情報の必要なディスク ドライブ。[出力] driveinfo
ドライブに関する情報が代入される _diskfree_t 構造体。
戻り値
正常終了した場合は、0 を返します。異常終了した場合は、エラー コードを返します。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 はドライブ A、3 はドライブ C を表します。
total_clusters
ディスク上の使用済みクラスタ数と空きクラスタ数の合計。avail_clusters
ディスク上の未使用クラスタ数。sectors_per_cluster
1 クラスタのセクタ数。bytes_per_sector
1 セクタのサイズ (バイト単位)。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_getdiskfree |
<direct.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// 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;
}
}
}
======================================================================
|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. | | |
======================================================================
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。