GetDiskFreeSpace 和 GetDiskFreeSpaceEx
文章目录
- 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相关推荐
- (转载博文)VC++API速查
窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...
- Windows API函数大全
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
- 使用WINAPI获得磁盘空间信息
范文庆们写的关于WINAPI的书,真心不错. 今天在南汇新场桃花节公路边等给同事们送门票时,我都看了一个多小时呢... 粗看一次了.再在细细的熟悉书中每个API吧. 其实,我计划的是,等熟悉WINDO ...
- 《精通Windows API-函数、接口、编程实例》——第4章文件系统
第4章文件系统 4.2 磁盘和驱动器管理 文件系统的基本概念: 包括磁盘分区,卷,目录,文件对象,文件句柄,文件映射 1.磁盘分区: 物理磁盘,逻辑磁盘 2.卷: 也称逻辑驱动器,是NTFS,FAT3 ...
- Windows_API_函数 参考大全
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
- 常用 API 函数(3): 文件处理函数
为什么80%的码农都做不了架构师?>>> CloseHandle 关闭一个内核对象.其中包括文件.文件映射.进程.线程.安全和同步对象等 CompareFileTime 对比两 ...
- win32 API函数大全
[1]. API之网络函数 WNetAddConnection :创建同一个网络资源的永久性连接 WNetAddConnection2 :创建同一个网络资源的连接 WNetAddConnecti ...
- vc++之windows api
WindowsAPI函数清单 WindowsAPI简介: API的英文全称(Application Programming Interface),WIN32 API也就是MicrosoftWindow ...
- Windows之API集合
1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同 ...
最新文章
- 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法...
- ffmpeg的内部Video Buffer管理和传送机制
- 苏炳添:发C刊与拿冠军相比,哪个更难?
- C/C++面试题—使用STL两个队列实现一个栈
- MYSQL执行sql时报错:Table 'performance_schema.session_status' doesn't exist解决办法
- hadoop eclipse 插件
- java 重定向到某个页面并弹出消息_前端面试100问之浏览器从输入URL到页面展示发生了什么...
- oracle删除数据库中的所有数据的拼接语句
- 计算机启动windows程序,win7系统开机自动运行程序怎么设置|win7电脑开机启动程序的方法...
- 转:android 简历
- Coursera 斯坦福大学科学论文写作课程笔记(二)
- python-docx处理word文档功能详细说明
- C++编程语言中重载运算符(operator)介绍
- 01Linux之计算机硬件软件介绍
- 浅谈三极管、运放、MOS管驱动 的常见电路
- 【Java写的碰碰球游戏(2) 】
- NPOI创建DOCX常用操作
- svchost.exe(LocalSystemNetworkRestricted)占用内存以及CPU
- java版破解淘宝客加密推广链接
- git am 冲突解决技巧
热门文章
- 成功解决''g++' 不是内部或外部命令,也不是可运行的程序 或批处理文件
- ModelFileType:XML、Hdf5、dat等不同模型文件后缀文件的简介、使用方法之详细攻略
- HighNewTech:重磅!来自深度学习的三位大牛Yoshua、Hinton、LeCun荣获2018年图灵奖
- Python:Python多种集成开发环境(IDE,编译器)的简介、安装、入门、使用方法之详细攻略
- TF学习——TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中
- Py之ipykernel:Python库之ipykernel简介、安装、使用方法之详细攻略
- CV之IC:计算机视觉之图像分类(Image Classification)方向的简介、使用方法、案例应用之详细攻略
- Linux监控实时log
- 创建游戏场(实战演习)
- 搭建本地 Registry - 每天5分钟玩转 Docker 容器技术(20)