windows下C语言编程获取磁盘(分区)使用情况

摘要:
在Windows下有很多好的工具可以获得,但我还没有在Windows下找到df命令。GetLogicalDriveStrings函数Windows API函数的名称通常很长。虽然不容易记住,但描述很清楚。使用示例获取所需的缓冲区长度#include<studio。h˃ #include<Windows h>intmain(){DWORDdw=GetLogicalDriveStrings;printf;return0;}编译后运行输出以获得所有驱动器号Example#include #include<Windows h>intmain(){DWORDdwSize=MAX_PATH;charszLogicalDrives[MAX_PATH]={0};//获取逻辑驱动器号字符串DWORDdwResult=GetLogicalDriveStrings//如果{char*szSingleDrive=szLogicalDrives;//从缓冲区的起始地址开始,而{printf;//输出单个驱动器的驱动器号//获取下一个驱动器号的起始地址szSingleDrive+=strlen+1;}}return0;}编译后,运行输出GetDriveType函数GetDriveType功能以确定磁盘驱动器的类型。
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
",dw); return 0;
 } 

编译后运行输出

windows下C语言编程获取磁盘(分区)使用情况第1张

获取所有驱动器号示例

#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
", szSingleDrive);   //输出单个驱动器的驱动器号
            // 获取下一个驱动器号起始地址
            szSingleDrive += strlen(szSingleDrive) + 1;
        }
    }
    return 0;
}

编译后运行输出

windows下C语言编程获取磁盘(分区)使用情况第2张


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_RAMDISKRAM映射磁盘

使用示例

获取所有驱动器号及其所属磁盘类型示例

输出逻辑驱动器类型函数

#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
", szSingleDrive);   //输出单个驱动器的驱动器号
            putDrivesType(szSingleDrive);           //输出逻辑驱动器类型
            // 获取下一个驱动器号起始地址
            szSingleDrive += strlen(szSingleDrive) + 1;
        }
    }
    return 0;
}

编译后运行输出

windows下C语言编程获取磁盘(分区)使用情况第3张


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
",
                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
", szSingleDrive);   //输出单个驱动器的驱动器号
            putDrivesType(szSingleDrive);           //输出逻辑驱动器类型
            putDrivesFreeSpace(szSingleDrive);
            // 获取下一个驱动器号起始地址
            szSingleDrive += strlen(szSingleDrive) + 1;
        }
    }
    return 0;
}

编译后运行输出
windows下C语言编程获取磁盘(分区)使用情况第4张

http://www.cnblogs.com/oloroso/p/4881394.html

免责声明:文章转载自《windows下C语言编程获取磁盘(分区)使用情况》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[算法模板]动态规划—斜率优化flask_apscheduler 定时任务框架下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

编程哲学

从去年到今年,陆陆续续看完了《代码大全》、《重构》、《代码整洁之道》、《程序员修炼之道》以及《The Art of Readable Code》,获益匪浅。下面就分享几条我赞同并信奉的编程哲学,顺便废话几句。 本文适合有一定编程经验的读者阅读,高手请轻喷:) 代码是写给人看的(Coding for Reading) 请先思考,评价一段代码优劣最重要的标...

转:linux的fatab文件详解

/etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。        当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。下面我来介绍如何在此文件下填写信息。      ...

【转】Grub Rescue修复方法

症状:开机显示: GRUB loading error:unknow filesystem grub rescue> 原因:已经发现下面几种操作会导致这种问题:1,想删除debian,于是直接在windows下删除/格式化了debian所在的分区。2,调整磁盘,利用工具合并/分割/调整/删除分区,使磁盘分区数目发生了变化。3,重新安装系统,把linu...

C语言两个libxml2库使用的问题

最近使用libxml2想做点东西,翻看一些example后还是有些疑问,去segmentfault问了下,感谢@pingjiang的热心解答,问题解决,记录如下 (一)如下是一个XML文件,p为根结点 <p> <one>1</one> <two>2</two> <th...

Linux系统扩容根目录磁盘空间的操作方法

一、使用背景 Linux根目录磁盘空间不够用了,当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘,但是发现系统里的大小还是没改变。 产生的原因是没有给磁盘格式化,没有增加分区。 二、操作方法 1. 查看磁盘空间大小,使用df -h 命令,发现挂载根目录节点的/dev/mapper/ubuntu14--vg-root 只有28G容量。 1 2 3 4...

静态反调试技术

         反调试技术大致分为静态反调试和动态反调试 。静态的只要在开始破解一次就可解除全部反调试限制。而动态的则要一边调试,一边破解。这里简单描述下静态反调试的实现方法。许多静态反调试技术对OS有较强的依赖性,这意味着有些反调试技术在不同的平台上可能会失效。 一.PEB(进程环境块) mov   eax,   dword ptr  FS:[0x3...