Windows程序设计12:获取磁盘分区信息


前言

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:获取磁盘分区信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能与优化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值