注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

获取磁盘分区信息  

2014-07-07 10:53:02|  分类: Windows编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

获取磁盘分区的总容量和空闲空间的容量可以使用GetDiskFreeSpace函数或者GetDiskFreeSpaceEx 函数。GetDiskFreeSpace使用DWORD类型作为输出参数,由于DWORD长度为32位,最大只能表示4GB,而一般的磁盘分区大小都大于4GB,所以,GetDiskFreeSpace并不直接返回磁盘的总容量和空闲空间的容量,而是使用总簇数、空闲的簇数、每簇的扇区数、每扇区的字节数来表示。用户在编程时,可以使用它们的乘积来获得最终结果。而GetDiskFreeSpaceEx使用 ULARGE_INTEGER(DWORD64)类型的数据来存储磁盘空间总空间和剩余空间,所以可以直接获得结果。DWORD64 可以表示约16777216TB的数据(DWORD64 最大可表示 264Byte,lTB=240Byte,所以结果最大为 264-40TB=224TB=16777216TB)。

GetDiskFreeSpace获取驱动器根路径作为输入,获取磁盘空间信息,包括每簇的扇区数、每扇区的字节数、簇数量、空闲的簇数量,其函数原型如下:

BOOL WINAPI GetDiskFreeSpace(
LPCTSTR lpRootPathName,
LPDWORD lpSectorsPerCluster,
LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters,
LPDWORD lpTotalNumberOfClusters
);
第一个参数是输入参数,指明待获取信息的磁盘根目录,必须带反斜杠(“\”)结尾,例如“C:\”。
第二个参数是每簇的扇区数
第三个是每扇区的字节数
第四个参数是空闲的簇数量
第五个参数是簇数量
#include <stdlib.h>
#include <stdio.h>
#include "windows.h"

int main()
{
    char buffer[MAX_PATH]="";
    char disk[4]="";//a disk
    DWORD bufLen;//actually return buffer length
    unsigned int i,p=0;
    DWORD dwSectorsPerCluster,dwBytesPerSector,dwNumberOfFreeClusters,dwTotalNumberOfClusters;
    double totalSpace,freeSpace;
    bufLen=GetLogicalDriveStringsA(MAX_PATH,buffer);
    for(i=0;i<bufLen;i++)
    {
        disk[p]=buffer[i];

        if(buffer[i]!='\0')
            p++;
        else
        {
            p=0;
            BOOL ret=GetDiskFreeSpaceA(disk,&dwSectorsPerCluster,&dwBytesPerSector,&dwNumberOfFreeClusters,&dwTotalNumberOfClusters);
            if(ret)
            {
                printf("Space information of %s\n",disk);
                printf("Sectors Per Cluster: %d\n",dwSectorsPerCluster);
                printf("Bytes Per Sector: %d\n",dwBytesPerSector);
                printf("Number Of Free Clusters: %d\n",dwNumberOfFreeClusters);
                printf("Total Number Of Clusters: %d\n",dwTotalNumberOfClusters);
                totalSpace=1.0*dwSectorsPerCluster*dwBytesPerSector*dwTotalNumberOfClusters/(1<<30);
                freeSpace=1.0*dwSectorsPerCluster*dwBytesPerSector*dwNumberOfFreeClusters/(1<<30);
                printf("Total Space: %fGB\n",totalSpace);
                printf("Free Space: %fGB\n",freeSpace);
                printf("===============================\n");
            }
        }
    }
    return 0;
}
程序运行结果如下:
image

GetDiskFreeSpaceEx则是采用了ULARGE_INTEGER联合体,其定义如下:

typedef union _ULARGE_INTEGER
{
    struct
    {
        DWORD LowPart;
        DWORD HighPart;
    };
    struct
    {
        DWORD LowPart;
        DWORD HighPart;
    } u;
    ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
此数据结构使用两个 DWORD 来表示64位数据。低位存储于前,高位存储于后,与 DWORD64 的存储形式是一致的,所以可以
直接强制类型转换为 DOWRD64 类型。也可以直接使用 QuadPart 成员,QuadPart 成员是ULONGLONG 形数据结构,在一般 32 位主机上,与DWORD64 具有同样的长度。再看看GetDiskFreeSpaceEx函数原型:
BOOL WINAPI GetDiskFreeSpaceEx(
LPCTSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailable,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

注意第二个参数和第四个参数,第二个参数是用户可用的空间,而第四个参数是实际空闲空间(这个值比可用的空间大,因为有部分空间被系统预留,不能被用户使用)。测试代码如下:

#include <stdlib.h>
#include <stdio.h>
#include "windows.h"

int main()
{
    char buffer[MAX_PATH]="";
    char disk[4]="";//a disk
    DWORD bufLen;//actually return buffer length
    unsigned int i,p=0;
    ULARGE_INTEGER FreeBytesAvailable,TotalNumberOfBytes,TotalNumberOfFreeBytes;
    bufLen=GetLogicalDriveStringsA(MAX_PATH,buffer);
    for(i=0;i<bufLen;i++)
    {
        disk[p]=buffer[i];

        if(buffer[i]!='\0')
            p++;
        else
        {
            p=0;
            BOOL ret=GetDiskFreeSpaceExA(disk,&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNumberOfFreeBytes);
            if(ret)
            {
                printf("Space information of %s\n",disk);
                printf("FreeBytesAvailable: %I64d Bytes\n",FreeBytesAvailable);
                printf("TotalNumberOfBytes: %I64d Bytes\n",TotalNumberOfBytes);
                printf("TotalNumberOfFreeBytes: %I64d Bytes\n",TotalNumberOfFreeBytes);
                printf("===============================\n");
            }
        }
    }
    return 0;
}

运行结果:

image

?

  评论这张
 
阅读(497)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016