_getdiskfree
使用磁盘驱动器的信息对_diskfree_t 结构进行填充。
重要
此 API 不能用于在 Windows 运行时 中执行的应用程序。有关更多信息,请参见不支持 /ZW 的 CRT 函数。
unsigned _getdiskfree(
unsigned drive,
struct _diskfree_t * driveinfo
);
参数
[in] drive
需要磁盘驱动器的信息。[out] 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
每个群集中的扇区数。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。有关详细信息,请参阅平台调用示例。