曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3996|回复: 0
打印 上一主题 下一主题

[文件与IO] GetDiskFreeSpaceEx() -- 获取磁盘容量信息(扩展版)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-2-14 14:41:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GetDiskFreeSpaceEx() 原型如下:
[C++] 纯文本查看 复制代码
BOOL WINAPI GetDiskFreeSpaceEx(
  __in_opt   LPCTSTR lpDirectoryName,
  __out_opt  PULARGE_INTEGER lpFreeBytesAvailable,
  __out_opt  PULARGE_INTEGER lpTotalNumberOfBytes,
  __out_opt  PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

该函数用来获得磁盘总空间和剩余空间,空间大小以字节表示,因为使用的是 DWORD64 数据类型,因此可以将很大的数据结果存入其中。DWORD64 (2^64 Byte)大约可以表示 16777216TB (2^64 / 2^40 = 2^24 TB)的数据量。

第 1 个参数 lpDirectoryName 可以是磁盘上的一个目录,一般指定磁盘分区的根路径名即可。

第 2 个参数 lpFreeBytesAvailable 用于存储可获得的总字节数。

第 3 个参数 lpTotalNumberOfBytes 用于存储磁盘空间总字节数据变量。

第 4 个参数 lpTotalNumberOfFreeBytes用于存储磁盘空闲空间的总字节。

第 2 个参数和第 4 个参数的区别是,磁盘上有的空间可能是预留给操作系统所用,而普通用户不能使用,第 2 个参数获得是用户实际可用的空闲空间,而第 4 个参数获得是所有的空闲空间。

函数中的第 2 个到第 4 个参数的类型是 ULARGE_INTEGER 指针,ULARGE_INTEGER 类型是个数据结构,定义如下:
[C++] 纯文本查看 复制代码
typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } ;
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

该数据结构使用两个 DWORD 来表示 64 位数据,低位存储在前,高位存储在后,与 DWORD64 的存储形式是一致的,所以也可以直接强制转换为 DWORD64 类型,也可以直接使用 QuadPart 成员,它是 ULONGLONG 数据类型,在 32 位机上,具有和 DWORD64 一样的长度。

测试代码
[C++] 纯文本查看 复制代码
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "chs");
    
    BOOL bResult;

    DWORD64 qwFreeBytesAvailable, qwTotalNumberOfBytes, qwTotalNumberOfFreeBytes;

    bResult = GetDiskFreeSpaceEx(argv[1], (PULARGE_INTEGER)&qwFreeBytesAvailable, (PULARGE_INTEGER)&qwTotalNumberOfBytes, (PULARGE_INTEGER)&qwTotalNumberOfFreeBytes);

    if (bResult) {

                _tprintf (TEXT("\n ==== %s 盘空间信息 ==== \n"), argv[1]);
        _tprintf (TEXT("磁盘分区总容量:\t\t%.2f GB\n"), (double)(qwTotalNumberOfBytes /(1024*1024*1024)));
        _tprintf (TEXT("可获得的空闲空间:\t\t%.2f GB\n"), (double)qwFreeBytesAvailable /(1024*1024*1024));
        _tprintf (TEXT("总的空闲空间:\t\t%.2f GB\n"), (double)qwTotalNumberOfFreeBytes /(1024*1024*1024));

    }
       return 0;
}

运行输出:
D:\WinAPI\DiskSpace\Debug>DiskSpace.exe D:\

==== D:\ 盘空间信息 ====
磁盘分区总容量:                468.00 GB
可获得的空闲空间:              353.85 GB
总的空闲空间:          353.85 GB

D:\WinAPI\DiskSpace\Debug>DiskSpace.exe E:\

==== E:\ 盘空间信息 ====
磁盘分区总容量:                340.00 GB
可获得的空闲空间:              86.28 GB
总的空闲空间:          86.28 GB
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-19 03:39 , Processed in 0.080755 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表