windows下C语言编程获取磁盘(分区)使用情况
windows下编程获取磁盘(分区)使用情况
linux下可以使用命令df -h
来获取各个(已加载)分区的使用情况。Windows下也有很多好的工具来获取,但是我没有发现windows下的df
命令。
在linux下使用df -h
命令的输出如下
o@Neo-kylin:~/snmp$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 197G 14G 174G 8% /
tmpfs 922M 76K 922M 1% /dev/shm
/dev/sda5 61G 7.8G 50G 14% /media/sda5
/dev/sda6 134G 29G 99G 23% /media/sda6
在windows下获取这些信息可以通过几个API函数来操作。
GetLogicalDriveStrings函数
Windows的API函数名称一般都很长,虽然不好记,但是描述的意思比较清晰。这个函数就是用于获取逻辑驱动器字符串
。
GetLogicalDriveStrings
实际上是一个宏,在没有定义UNICODE
宏的条件下,它被替换为GetLogicalDriveStringA
函数,在定义了UNICODE
宏的条件下,它被替换为GetLogicalDriveStringsW
函数。
这两个函数的声明如下
DWORD GetLogicalDriveStringsA( DWORD nBufferLength, _Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer );
DWORD
GetLogicalDriveStringsW(
DWORD nBufferLength,
_Out_writes_to_opt_(nBufferLength, return + 1) LPWSTR lpBuffer
);
这个的参数看起来很复杂,其实并没有。函数需要提供一个内存缓冲区lpBuffer
来供它保存获取的逻辑驱动器的分区号(C:\ ,D:\等)信息。
如果参数nBufferLength
填写0
,那么将缓冲区将不使用,函数返回保存所有数据所需要的字节数。这通常用户获取需要的缓冲区大小。
应该总是比较返回值与参数nBufferLength
的大小。
如果函数成功,返回值是复制到缓冲区的字符串的长度, 不包括结束符null
。注意,ansi-ascii的null
字符用一个字节,但 Unicode(UTF-16)null
字符用两个字节。
如果缓冲区不够大,返回值是大于nbufferlength
。它要求具有能够保持驱动字符串大小的缓冲区。
如果函数失败,返回值是零。为了获得更多的错误信息,可以使用GetLastError函数。
这里不讲UNICODE
与多字节字符集的区别。指导一点就好,使用多字节字符集的时候,当作普通的C风格字符串来使用即可。
使用示例
获取需要的缓冲区长度示例
#include <stdio.h>
#include <Windows.h>
int main()
{
DWORD dw = GetLogicalDriveStrings(0,NULL);
printf("dw = %lu\n",dw); return 0;
}
编译后运行输出
获取所有驱动器号示例
#include <stdio.h>
#include <Windows.h>
int main()
{
DWORD dwSize = MAX_PATH;
char szLogicalDrives[MAX_PATH] = {0};
//获取逻辑驱动器号字符串
DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
//处理获取到的结果
if (dwResult > 0 && dwResult <= MAX_PATH) {
char* szSingleDrive = szLogicalDrives; //从缓冲区起始地址开始
while(*szSingleDrive) {
printf("Drive: %s\n", szSingleDrive); //输出单个驱动器的驱动器号
// 获取下一个驱动器号起始地址
szSingleDrive += strlen(szSingleDrive) + 1;
}
}
return 0;
}
编译后运行输出
GetDriveType函数
GetDriveType函数用于判断一个磁盘驱动器的类型。
函数声明如下
UINT WINAPI GetDriveType(
_In_opt_ LPCTSTR lpRootPathName
);
参数lpRootPathName
包含了根目录路径的字符串指针。
如驱动器不能识别,则返回零。如指定的目录不存在,则返回1。如执行成功,则用下述任何一个常数指定驱动器类型
常数 | 含义 |
---|---|
DRIVE_UNKNOWN | 未知的磁盘类型 |
DRIVE_NO_ROOT_DIR | 说明lpRootPathName是无效的 |
DRIVE_REMOVABLE | 可移动磁盘 |
DRIVE_FIXED | 固定磁盘 |
DRIVE_REMOTE | 网络磁盘 |
DRIVE_CDROM | 光驱 |
DRIVE_RAMDISK | RAM映射磁盘 |
使用示例
获取所有驱动器号及其所属磁盘类型示例
输出逻辑驱动器类型函数
#include <stdio.h>
#include <Windows.h>
void putDrivesType(const char* lpRootPathName)
{
UINT uDriverType = GetDriveType(lpRootPathName);
switch(uDriverType) {
case DRIVE_UNKNOWN :puts("未知的磁盘类型"); break;
case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;
case DRIVE_REMOVABLE: puts("可移动磁盘"); break;
case DRIVE_FIXED: puts("固定磁盘"); break;
case DRIVE_REMOTE: puts("网络磁盘"); break;
case DRIVE_CDROM: puts("光驱"); break;
case DRIVE_RAMDISK: puts("内存映射盘"); break;
default:
break;
}
}
调用
int main()
{
DWORD dwSize = MAX_PATH;
char szLogicalDrives[MAX_PATH] = {0};
//获取逻辑驱动器号字符串
DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
//处理获取到的结果
if (dwResult > 0 && dwResult <= MAX_PATH) {
char* szSingleDrive = szLogicalDrives; //从缓冲区起始地址开始
while(*szSingleDrive) {
printf("Drive: %s\n", szSingleDrive); //输出单个驱动器的驱动器号
putDrivesType(szSingleDrive); //输出逻辑驱动器类型
// 获取下一个驱动器号起始地址
szSingleDrive += strlen(szSingleDrive) + 1;
}
}
return 0;
}
编译后运行输出
GetDiskFreeSpaceEx 函数
GetDiskFreeSpaceEx
函数用户获取逻辑驱动器的容量信息。还有一个和它长得很像的函数GetDiskFreeSpace
,但这个函数已经过时了,不推荐使用。
函数声明如下
BOOL WINAPI GetDiskFreeSpaceEx(
_In_ LPCTSTR lpRootPathName,
_Out_ LPDWORD lpSectorsPerCluster,
_Out_ LPDWORD lpBytesPerSector,
_Out_ LPDWORD lpNumberOfFreeClusters,
_Out_ LPDWORD lpTotalNumberOfClusters
);
这个函数的参数要仔细的说明一下。
参数 | 含义 |
---|---|
lpDirectoryName | 逻辑驱动器的名称(C/D/E等这些) |
lpFreeBytesAvailableToCaller | 用户(当前线程)可用的磁盘空间字节数 |
lpTotalNumberOfBytes | 逻辑磁盘总的空间字节数 |
lpTotalNumberOfFreeBytes | 逻辑磁盘空闲的空间字节数 |
上面三个字节数的单位都是字节,数据类型都是64位无符号整型。
GetDiskFreeSpaceEx
函数执行成功返回非0值,失败返回0。可以通过GetLastError
函数获取失败信息。
使用示例
获取磁盘容量信息示例
下面的函数用来输出磁盘的容量信息。
void putDrivesFreeSpace(const char* lpRootPathName)
{
unsigned long long available,total,free;
if(GetDiskFreeSpaceEx(lpRootPathName,(ULARGE_INTEGER*)&available,(ULARGE_INTEGER*)&total,(ULARGE_INTEGER*)&free)){
printf("Drives %s | total = %lld MB,available = %lld MB,free = %lld MB\n",
lpRootPathName,total>>20,available>>20,free>>20);
}else{
puts("获取容量信息失败");
}
}
调用如下
int main()
{
DWORD dwSize = MAX_PATH;
char szLogicalDrives[MAX_PATH] = {0};
//获取逻辑驱动器号字符串
DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
//处理获取到的结果
if (dwResult > 0 && dwResult <= MAX_PATH) {
char* szSingleDrive = szLogicalDrives; //从缓冲区起始地址开始
while(*szSingleDrive) {
printf("Drive: %s\n", szSingleDrive); //输出单个驱动器的驱动器号
putDrivesType(szSingleDrive); //输出逻辑驱动器类型
putDrivesFreeSpace(szSingleDrive);
// 获取下一个驱动器号起始地址
szSingleDrive += strlen(szSingleDrive) + 1;
}
}
return 0;
}
编译后运行输出
windows下C语言编程获取磁盘(分区)使用情况的更多相关文章
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- Windows下C语言的Socket编程例子(TCP和UDP)
原文:Windows下C语言的Socket编程例子(TCP和UDP) 刚刚学windows编程,所以想写学习笔记,这是一个简单的Socket程序例子,开发环境是vc6: 首先是TCP server端: ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- 【转】Linux基础与Linux下C语言编程基础
原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- 在windows下的QT编程中的_TCHAR与QString之间的转换
由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef ...
随机推荐
- 20145212 《Java程序设计》第10周学习总结
20145212 <Java程序设计>第10周学习总结 学习内容总结 一.Java的网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net ...
- javac 及 java命令的使用问题(错误或无法加载主类)
一.问题 使用 javac 命令编译完.java源文件后,用 java 命令运行.class文件时,通常会遇到如下或类似的问题: 错误: 找不到或无法加载主类 HelloWorld.class 二.解 ...
- Yii2 高级版新建一个 Api 应用
原文地址:http://www.getyii.com/topic/28 先在项目的根目录下复制一份 backend 为 api: cp backend/ api -r 拷贝 api 环境 cp -a ...
- [转] MemCached 的 stats 命令
Memcached有个stats命令,通过它可以查看Memcached服务的许多状态信息.使用方法如下:先在命令行直接输入telnet 主机名端口号,连接到memcached服务器,然后再连接成功后, ...
- 二叉排序树(Binary Sort Tree)
参考文章:http://blog.csdn.net/ns_code/article/details/19823463 不过博主的使用第一种方法操作后的树已经不是二叉排序树了,值得深思!! #inclu ...
- Java并发编程核心方法与框架-TheadPoolExecutor的使用
类ThreadPoolExecutor最常使用的构造方法是 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAli ...
- mysql数据表分表策略2(转)
mysql分表方法: 方法一. 做数据库集群! 主从数据库 双向热备份(或一对多的数据库实时备份策略),这样可将数据库查询分摊到几个服务器去(可跟服务器负载均衡结合起来架构) 优点:扩展性好,没有多个 ...
- Java8初体验(一)lambda表达式语法
感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解 ...
- mapreduce 模板
/*** * MapReduce Module * @author nele * */ public class ModuleMapReduce extends Configured implemen ...
- javascript的对象 和 JSON 对象?
关于js和JSON的 一篇 好文章: http://www.68idc.cn/help/makewebs/javascript/20150704416007.html 讲的很好 很易懂 在将javas ...