前言
Windows程序设计12:获取磁盘分区信息。
一、磁盘分区信息简介
获取磁盘分区信息的作用有很多,如:安装软件要动态判断所选路径是否存在、写日志文件也要判断磁盘信息、远控软件等要用到这些信息。。。等等。因此,获取磁盘分区信息是很有用的。
二、获得当前所有磁盘分区:GetLogicalDriveStrings
获取一个字符串,其中包含了当前所有逻辑驱动器的跟驱动器路径。函数原型为
DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // 缓冲区大小(以字符为单位)
LPTSTR lpBuffer // 接收驱动器字符串的缓冲区
);
参数DWORD nBufferLength为缓冲区的大小(以字符为单位)。如果缓冲区不足以存储所有驱动器的根路径,函数会返回所需的缓冲区大小。
参数LPTSTR lpBuffer指向接收驱动器字符串的缓冲区的指针。缓冲区中的字符串以 null 字符分隔,最后一个字符串以两个 null 字符结尾。如果参数DWORD nBufferLength传递0,则该参数就没有用了。
返回值:如果成功,返回写入缓冲区的字符数(不包括终止的 null 字符)。如果缓冲区太小,返回所需的缓冲区大小(以字符为单位)。如果失败,返回 0。可以通过 GetLastError 获取错误代码。
运行如下代码
#include<windows.h>
#include<tchar.h>
#include<iostream>
using namespace std;
#define str_len 32
// 前两个参数用的不多,后两个参数用的较多,
//第一个参数为当前程序的实例句柄;第二个参数为上一个程序的实例句柄;第三个参数为命令行参数(字符串类型);第四个参数为显示方式
//int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd) // 通用字节类型的入口点函数
int _tmain(int arge, TCHAR *argv[])
{
TCHAR szDrives[MAX_PATH] = { 0 };
GetLogicalDriveStrings(MAX_PATH, szDrives);
return 0;
}
可以正常读取磁盘信息
但是上述代码比较浪费空间,直接开辟了MAX_PATH长度的字符串。下面根据需要动态开辟空间,同时输出每个磁盘信息
#include<windows.h>
#include<tchar.h>
#include<iostream>
using namespace std;
#define str_len 32
// 前两个参数用的不多,后两个参数用的较多,
//第一个参数为当前程序的实例句柄;第二个参数为上一个程序的实例句柄;第三个参数为命令行参数(字符串类型);第四个参数为显示方式
//int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd) // 通用字节类型的入口点函数
int _tmain(int arge, TCHAR *argv[])
{
DWORD sn = GetLogicalDriveStrings(0, NULL); // 利用返回值得到需要开辟的空间大小
if (sn > 0)
{
TCHAR* szDrives = new TCHAR[sn];
ZeroMemory(szDrives, (sn) * sizeof(TCHAR)); // 将数组中所有值初始化为0,即\0
sn = GetLogicalDriveStrings(sn, szDrives);
if (sn > 0)
{
TCHAR* p_temp = szDrives;
do
{
wcout << p_temp << endl;
p_temp = p_temp + _tcslen(p_temp) + 1; // +1是为了跳过每个\0
} while (*p_temp);
}
delete[] szDrives;
}
return 0;
}
本机有三个磁盘
全部正确输出
三、获得磁盘分区类型GetDriveType
用来确定磁盘驱动器的类型,是可移动的,固定的,CD-Rom光驱的等等。函数原型
UINT GetDriveType(
LPCTSTR lpRootPathName // 驱动器的根路径(如 "C:\\")
);
参数LPCTSTR lpRootPathName指向驱动器根路径的字符串(如 “C:\”)。如果为 NULL,函数返回当前驱动器的类型。
返回值:返回一个 UINT 值,表示驱动器的类型。
这里以判断本机每个驱动器的类型为例
运行代码如下
#include<windows.h>
#include<tchar.h>
#include<iostream>
using namespace std;
#define str_len 32
// 前两个参数用的不多,后两个参数用的较多,
//第一个参数为当前程序的实例句柄;第二个参数为上一个程序的实例句柄;第三个参数为命令行参数(字符串类型);第四个参数为显示方式
//int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, INT nShowCmd) // 通用字节类型的入口点函数
int _tmain(int arge, TCHAR *argv[])
{
DWORD sn = GetLogicalDriveStrings(0, NULL); // 利用返回值得到需要开辟的空间大小
if (sn > 0)
{
TCHAR* szDrives = new TCHAR[sn];
ZeroMemory(szDrives, (sn) * sizeof(TCHAR)); // 将数组中所有值初始化为0,即\0
sn = GetLogicalDriveStrings(sn, szDrives);
if (sn > 0)
{
TCHAR* p_temp = szDrives;
do
{
wcout << p_temp ;
UINT c_type = GetDriveType(p_temp);
switch (c_type)
{
case DRIVE_UNKNOWN: cout << "驱动器类型未知" << endl;
break;
case DRIVE_NO_ROOT_DIR: cout << "根路径无效" << endl;
break;
case DRIVE_REMOVABLE: cout << "可移动驱动器(U盘)" << endl;
break;
case DRIVE_FIXED: cout << "固定磁盘(如硬盘)" << endl;
break;
case DRIVE_REMOTE: cout << "网络驱动器" << endl;
break;
case DRIVE_CDROM: cout << "光盘驱动器" << endl;
break;
case DRIVE_RAMDISK: cout << "RAM 磁盘" << endl;
break;
default:
break;
}
cout << endl;
p_temp = p_temp + _tcslen(p_temp) + 1; // +1是为了跳过每个\0
} while (*p_temp);
}
delete[] szDrives;
}
return 0;
}
得到如下结果
说明全部读取成功。
下面在本机插入一个U盘再运行一遍
F盘为U盘,运行得到的结果为
同样获取成功
总结
Windows程序设计12:获取磁盘分区信息。