通过对 Windows API 基础的一些学习,自己编写了一个可以读取卷的名称、文件系统类型、大小和剩余大小这些基本信息的小程序。程序很简单,却也受益匪浅。
定义的宏:
#define BUFFSIZE MAX_PATH
#define DIVISOR 1073741824.0
BUFFSIZE: 保存卷的相关信息的数组的大小
MAX_PATH: C语言运行库中通过#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度。(摘自百度百科)
DIVISOR(除数):用于将字节单位(Byte)转为吉字节单位(GB)
几种值得一提的类型:
ULARGE_INTEGER 和指向其的指针 PUNLARGE_INTEGER,以下为其定义:
//ULARGE_INTEGER, PULARGE_INTEGER
typedef union _ULARGE_INTEGER{
struct{
DWORD LowPart;
DWORD Highpart;
};
struct{
DWORD LowPart;
DWORD Highpart;
} u;
ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
可以看出,该类型是一个联合体。其中,结构体通过两个 DWORD (32bit)来表示一个 64bit 的数据,而 ULONGLONG 则直接表示 64bit 数据。
DWORD: 一个无符号长整型类型,一般为 32bit
typedef unsigned long DWORD;
DWORD64:一个无符号 64bit 长整型
typedef unsigned __int64 DWORD64, *PDWORD64;
需要注意的是,在新版本中输出 64bit 长整型数据应使用 %I64i
在运行测试中,可以显示分卷的名称、文件系统类型、和大小信息,插入U盘后也可识别,但是将手机接入电脑,并调成文件传输模式却并没有识别出手机的储存空间的信息,这一点让我很迷惑,希望有明白的朋友不吝赐教。
最后附上代码:
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFFSIZE MAX_PATH
#define DIVISOR 1073741824.0
int main(void) {
CHAR rootPathName[BUFFSIZE], volumeName[BUFFSIZE], fileSystemName[BUFFSIZE];
DWORD volumeSerialNumber, maxFileLength, fileSystemFlags;
HANDLE hFindVolume;
DWORD64 freeByteAvailable, totalByte, totalFreeByte;
hFindVolume = FindFirstVolume(rootPathName, BUFFSIZE);
do{
if (GetVolumeInformation(rootPathName, volumeName, BUFFSIZE,
&volumeSerialNumber, &maxFileLength, &fileSystemFlags,
fileSystemName, BUFFSIZE)) {
GetDiskFreeSpaceEx(rootPathName,
(PULARGE_INTEGER)&freeByteAvailable, (PULARGE_INTEGER)&totalByte, (PULARGE_INTEGER)&totalFreeByte);
printf("%s \nFile Type: \t %s \nTotal Space: \t %I64i(Byte) \t %.1lf(GB) \nFree Space: \t %I64i(Byte) \t %.1lf(GB)\n",
volumeName, fileSystemName, totalByte, totalByte / DIVISOR, freeByteAvailable, freeByteAvailable / DIVISOR);
}
putchar('\n');
} while (FindNextVolume(hFindVolume, rootPathName, BUFFSIZE));
system("pause");
return 0;
}