文章目录

  • GetDiskFreeSpace
  • 函数声明
  • 函数功能
  • 第一个参数:
  • 第二个参数:
  • 第三个参数:
  • 第四个参数:
  • 第五个参数:
  • 返回值
  • 补充
  • 代码实现
  • GetDiskFreeSpaceEx
  • 函数声明
  • 函数功能
  • 第一个参数
  • 第二个参数
  • 第三个参数
  • 第四个参数
  • 返回值
  • 代码实现
  • 补充:

GetDiskFreeSpace

函数声明

BOOL GetDiskFreeSpace(LPCTSTR lpRootPathName, //rootpathLPDWORD lpSectorsPerCluster, //sectorsperclusterLPDWORD lpBytesPerSector ,//bytespersectorLPDWORD lpNumberOfFreeClusters, //freeclustersLPDWORD lpTotalNumberOfClusters //totalclusters);

函数功能

获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量。该函数是获取指定磁盘的信息(包括剩余空间的信息),函数不能获取到卷的大小超过2GB的磁盘的信息,如果要获得可以使用GetDiskFreeSpaceEx函数;来实现

第一个参数:

pRootPathName输入参数,磁盘的根目录,如果设置为空,函数就使用 当前目录作为这个参数传入,如果指定的是一个UNC名的话,文件名的最后必须带上一个反斜杠

第二个参数:

lpSectorsPerCluster,输出参数,指定每个簇的扇区数目

第三个参数:

lpBytesPerSector输出参数, 指定每个扇区的字节数目

第四个参数:

lpNumberOfFreeClusters输出参数, 磁盘总的空闲簇数目

第五个参数:

lpTotalNumberOfClusters 输出参数,磁盘总的簇数目

返回值

调用成功 将返回一个非0值

调用不成功 返回0 可以通过GetLastError来获得错误信息

补充

簇 - 文件系统用来管理文件数据的最小单位。

每一个簇都是由连续的几个 扇区组成,例如

通常是由1/2/4/8/16… 扇区组成。

FAT16/32 - 4K、8K

NTFS - 4K

全部空间(TotalLetfSize) = 总簇数量 * 每簇的扇区数 * 每扇区字节数。
剩余空间(TotalLetfSize) = 空余簇数量 * 每簇的扇区数 * 每扇区字节数。

代码实现

 BOOL bResult;DWORD dwTotalClusters;DWORD dwFreeClusters;DWORD dwSectPerClust;DWORD dwbytesPerSect;bResult = GetDiskFreeSpace(TEXT("c:"), &dwSectPerClust, &dwbytesPerSect, &dwFreeClusters, &dwTotalClusters);if (bResult) {printf("\n使用 GetDiskFreeSpace获取磁盘空间信息\n");printf("总簇数量:\t\t\t%I64d\n",dwTotalClusters);printf("空闲的簇数量:\t\t\t%I64d\n", dwFreeClusters);printf("每簇的扇区数量:\t\t\t%I64d\n", dwSectPerClust);printf("每扇区的字节数:\t\t\t%I64d\n", dwbytesPerSect);printf("磁盘总容量:\t\t\t%I64d\n", (DWORD64)dwTotalClusters* (DWORD64)dwSectPerClust* (DWORD64)dwbytesPerSect);printf("磁盘空闲容量:\t\t\t%I64d\n", (DWORD64)dwFreeClusters * (DWORD64)dwSectPerClust * (DWORD64)dwbytesPerSect);}

GetDiskFreeSpaceEx

GetDiskFreeSpaceEx(TEXT("c:"),(PULARGE_INTEGER)&qwFreeBytesTocaller,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes);

函数声明

BOOL GetDiskFreeSpaceEx( LPCWSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

函数功能

可以得到驱动器的簇信息,剩余空间以及总大小。

第一个参数

lpDirectoryName,输入参数,磁盘的根目录,如果设置为空,函数就使用 当前目录作为这个参数传入,如果指定的是一个UNC名的话,文件名的最后必须带上一个反斜杠

第二个参数

lpFreeBytesAvailableToCaller指定一个变量,用于容纳 调用者 可用的字节数量

第三个参数

lpTotalNumberOfBytes指定一个变量,用于容纳磁盘上的总字节数

第四个参数

lpTotalNumberOfFreeBytes指定一个变量,用于容纳磁盘上可用的字节数

返回值

Long,非零表示成功,零表示失败。会设置GetLastError

代码实现

DWORD64 qwFreeBytes, qwFreeBytesTocaller, qwTotalBytes;bResult = GetDiskFreeSpaceEx(TEXT("c:"),(PULARGE_INTEGER)&qwFreeBytesTocaller,(PULARGE_INTEGER)&qwTotalBytes,(PULARGE_INTEGER)&qwFreeBytes);if (bResult) {printf("\n使用GetDiskFreeSpaceEx获取磁盘空间信息\n");printf("磁盘总容量:\t\t\t%I64d\n",qwTotalBytes );printf("可用的磁盘空闲容量:\t\t\t%I64d\n",qwFreeBytes );printf("磁盘空闲容量:\t\t\t%I64d\n", qwFreeBytesTocaller);}

把两个函数一起运行一下,看看是否数据相等:

查看了一下,完全一样,到这里呢,game over!!

补充:

讲一下PULARGE_INTEGER。我们这个函数得到的信息是磁盘的总大小、当前用户可操作大小、剩余磁盘空间,单位是字节。但是在我的电脑上int 以及 long int都是4个字节,也就是最大(无符号)能存是数232字节,等于4G左右,显然已经不够了,现在随意一个分区就是几百G。所以这个函数用了一个特别的方法,即用一个联合,里面保存着一个结构体,而结构体里面有两个32位的整数,分别表示该数的上半部分和下半部分。于是就可以表示出一个64位的整数了。

typedef union _ULARGE_INTEGER {struct {DWORD LowPart;DWORD HighPart;} u;ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

PULARGE_INTEGER其实指向的是这个联合,这个联合中的结构体中的LowPart表示低32位,HighPart表示高32位。

不过输出得到的是一大串数字(因为是以字节为单位),如果我们想以MB或GB为单位怎么办呢?直接拿TotalNumberOfBytes/1024/1024,发现编译会报错。你拿一个联合去和一个整数做除法运算,肯定报错。

int Total = (TotalNumberOfBytes.u.HighPart << 12) + (TotalNumberOfBytes.u.LowPart >> 20);

将高32位向左移12位,将低32位向右移20位,再相加,目的是什么?先看将LowPart向右移20位,剩下的其实就是LowPart的左12位。因为我们要得到以MB为单位,而1MB是2^20字节,所以只保留LowPart的左12位。而HighPart的所有位都应该保留,所以要放在第13位以后,故HighPart左移12位,最后相加

最后Total再想转换成GB就除以1024.0就可以。

注意: LARGE_INTEGER结构与FILETIME结构在内部完全一致。正式调用前,用GetVersionEx判断函数是否得到了支持。在Windows 95 OSR2环境中,OSVERSIONINFO结构的dwBuildNumbe字段会大于1000

备注:
2021年坚持学写博客第9天(学习两个windows API) 寻梦SS

明日目标:
windows核心编程API函数

GetDiskFreeSpace 和 GetDiskFreeSpaceEx相关推荐

  1. (转载博文)VC++API速查

    窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...

  2. Windows API函数大全

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  3. 使用WINAPI获得磁盘空间信息

    范文庆们写的关于WINAPI的书,真心不错. 今天在南汇新场桃花节公路边等给同事们送门票时,我都看了一个多小时呢... 粗看一次了.再在细细的熟悉书中每个API吧. 其实,我计划的是,等熟悉WINDO ...

  4. 《精通Windows API-函数、接口、编程实例》——第4章文件系统

    第4章文件系统 4.2 磁盘和驱动器管理 文件系统的基本概念: 包括磁盘分区,卷,目录,文件对象,文件句柄,文件映射 1.磁盘分区: 物理磁盘,逻辑磁盘 2.卷: 也称逻辑驱动器,是NTFS,FAT3 ...

  5. Windows_API_函数 参考大全

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

  6. 常用 API 函数(3): 文件处理函数

    为什么80%的码农都做不了架构师?>>>    CloseHandle 关闭一个内核对象.其中包括文件.文件映射.进程.线程.安全和同步对象等 CompareFileTime 对比两 ...

  7. win32 API函数大全

    [1]. API之网络函数  WNetAddConnection :创建同一个网络资源的永久性连接  WNetAddConnection2 :创建同一个网络资源的连接  WNetAddConnecti ...

  8. vc++之windows api

    WindowsAPI函数清单 WindowsAPI简介: API的英文全称(Application Programming Interface),WIN32 API也就是MicrosoftWindow ...

  9. Windows之API集合

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...

最新文章

  1. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法...
  2. ffmpeg的内部Video Buffer管理和传送机制
  3. 苏炳添:发C刊与拿冠军相比,哪个更难?
  4. C/C++面试题—使用STL两个队列实现一个栈
  5. MYSQL执行sql时报错:Table 'performance_schema.session_status' doesn't exist解决办法
  6. hadoop eclipse 插件
  7. java 重定向到某个页面并弹出消息_前端面试100问之浏览器从输入URL到页面展示发生了什么...
  8. oracle删除数据库中的所有数据的拼接语句
  9. 计算机启动windows程序,win7系统开机自动运行程序怎么设置|win7电脑开机启动程序的方法...
  10. 转:android 简历
  11. Coursera 斯坦福大学科学论文写作课程笔记(二)
  12. python-docx处理word文档功能详细说明
  13. C++编程语言中重载运算符(operator)介绍
  14. 01Linux之计算机硬件软件介绍
  15. 浅谈三极管、运放、MOS管驱动 的常见电路
  16. 【Java写的碰碰球游戏(2) 】
  17. NPOI创建DOCX常用操作
  18. svchost.exe(LocalSystemNetworkRestricted)占用内存以及CPU
  19. java版破解淘宝客加密推广链接
  20. git am 冲突解决技巧

热门文章

  1. 成功解决''g++' 不是内部或外部命令,也不是可运行的程序 或批处理文件
  2. ModelFileType:XML、Hdf5、dat等不同模型文件后缀文件的简介、使用方法之详细攻略
  3. HighNewTech:重磅!来自深度学习的三位大牛Yoshua、Hinton、LeCun荣获2018年图灵奖
  4. Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略
  5. TF学习——TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中
  6. Py之ipykernel:Python库之ipykernel简介、安装、使用方法之详细攻略
  7. CV之IC:计算机视觉之图像分类(Image Classification)方向的简介、使用方法、案例应用之详细攻略
  8. Linux监控实时log
  9. 创建游戏场(实战演习)
  10. 搭建本地 Registry - 每天5分钟玩转 Docker 容器技术(20)