Windows中卷(Volume)操作,获取卷GUID、磁盘类型、磁盘大小等API

2023-11-06

Windows中卷(Volume)操作

1、阅读msdn整理卷相关的知识点

https://docs.microsoft.com/zh-cn/windows/win32/fileio/volume-management
在这里插入图片描述

2、重点讲解几个常用的API及其示例

2.1、GetVolumeNameForVolumeMountPoint

用于获取卷的GUID路径,通过与该卷相关的挂载点(mount point)(如:盘符(drive letter),挂载文件夹等)。

API:

BOOL GetVolumeNameForVolumeMountPointW(
  [in]  LPCWSTR lpszVolumeMountPoint,
  [out] LPWSTR  lpszVolumeName,
  [in]  DWORD   cchBufferLength
);

示例代码:

#include <Windows.h>
#include <stdio.h>
#include <tchar.h>

#define BUFSiZE MAX_PATH

void main(void)
{
	BOOL bFlag;
	TCHAR buf[BUFSiZE];
	TCHAR Drive[] = TEXT("c:\\");
	TCHAR I;
	for (I = TEXT('c'); I < TEXT('z'); ++I){
		Drive[0] = I;
		bFlag = GetVolumeNameForVolumeMountPoint(
			Drive, buf, BUFSiZE);

		if (bFlag){
			/**
			result:
			The Id of drive "c:\" is "\\?\Volume{252dcdf3-1487-4c35-a7a6-bd5ad25feb35}\"
            The Id of drive "d:\" is "\\?\Volume{9713a0fb-9880-4a80-8a7d-2adbc29d846f}\"
            The Id of drive "e:\" is "\\?\Volume{8348e8d4-d652-11ec-8a07-50814024957f}\"
			*/
			_tprintf(TEXT("The Id of drive \"%s\" is \"%s\"\n"), Drive, buf);
		}
	}
	return;
}

2.2、GetDriveType(A/W)

用于确定指定的磁盘驱动器是移动的(removable)、固定的(fixed)、CD-ROM、RAMDISK还是网络设备。

确定一个设备是否是USB类型,可以调用SetupDiGetDeviceRegistryProperty并指定SPDRP_REMOVAL_POLICY属性。

API:

UINT GetDriveTypeW(
  [in, optional] LPCWSTR lpRootPathName
);

示例代码:

#include <iostream>
#include <Windows.h>
#include <fileapi.h>

int main()
{
	UINT type = GetDriveType("E:\\test.m4a");
	switch (type)
	{
	case DRIVE_UNKNOWN:
		std::cout << "unknow" << std::endl;
		break;
	case DRIVE_NO_ROOT_DIR:
		std::cout << "no root dir" << std::endl;
		break;
	case DRIVE_REMOVABLE:
		std::cout << "removable" << std::endl;
		break;
	case DRIVE_FIXED:
		std::cout << "fixed" << std::endl;
		break;
	case DRIVE_REMOTE:
		std::cout << "remote" << std::endl;
		break;
	case DRIVE_CDROM:
		std::cout << "cdrom" << std::endl;
		break;
	case DRIVE_RAMDISK:
		std::cout << "ramdisk" << std::endl;
		break;
	default:
		break;
	}
	return 0;
}

2.3、GetDiskFreeSpaceEx(A/W)

用于获取一个磁盘空间数量信息,如磁盘总大小、剩余大小以及用户可用的剩余大小。

注意:单位是bytes

API:

// 数据结构
#if defined(MIDL_PASS)
typedef struct _ULARGE_INTEGER {
#else // MIDL_PASS
typedef union _ULARGE_INTEGER {
    struct {
        DWORD LowPart;
        DWORD HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        DWORD LowPart;
        DWORD HighPart;
    } u;
#endif //MIDL_PASS
    ULONGLONG QuadPart;
} ULARGE_INTEGER;
    
typedef ULARGE_INTEGER *PULARGE_INTEGER;

BOOL GetDiskFreeSpaceExA(
  [in, optional]  LPCSTR          lpDirectoryName,
  [out, optional] PULARGE_INTEGER lpFreeBytesAvailableToCaller,
  [out, optional] PULARGE_INTEGER lpTotalNumberOfBytes,
  [out, optional] PULARGE_INTEGER lpTotalNumberOfFreeBytes
);

示例代码:

#include <Windows.h>
#include <stdio.h>

void main(void)
{
	WCHAR *dirName = L"D:\\test";
	ULARGE_INTEGER avail, total, totalFree;
	GetDiskFreeSpaceExW(dirName, &avail, &total, &totalFree);
	printf("%llu \n %llu\n %llu\n", avail.QuadPart, total.QuadPart, totalFree.QuadPart);
	return;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows中卷(Volume)操作,获取卷GUID、磁盘类型、磁盘大小等API 的相关文章

  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • MD 和 MKDIR 批处理命令有什么区别?

    这两个命令都会创建文件夹 我read http www computerhope com mdhlp htmMKDIR 甚至可以创建子文件夹 这只是区别吗 为什么有两个命令做同样的事情 我应该使用哪一个 除了 npocmaka 的answe
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 推送更改到 Git 不起作用

    每次我想要提交命令 git push heroku master 时 系统都会要求我在 PowerShell 中输入凭据 当我输入 heroku 凭据 默认情况下连接到 git 时 我收到错误消息 但是 当我输入我的主目录中的 netrc
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code

随机推荐

  • TLS回调函数的两种写法

    include
  • 泛型+通配符(数学角度)

    打破常规 换个角度重新认识泛型和通配符 跳转提示 如果已经熟悉泛型基础知识的小伙伴可以直接跳过引入泛型这一部分 因为这一部分是关于泛型的基础知识的讲解 文章篇幅较长 想看换个角度认识泛型的部分 可以直接跳过引入泛型这部分 直接看从数学函数角
  • windows安裝mysql步骤

    1 mysql安装分为两种 一种是msi格式的 一种是zip格式的 zip格式相当于绿色版 不需要安装 只需解压缩之后就可以使用了 但是要进行配置 msi格式是安装版 2 mysql官网下载 https www mysql com 3 安装
  • 金融行业知识汇总

    文章目录 一 名词解释 1 一级市场 二级市场 2 投行 PE VC 1 投行 Investment Bank IB 2 VC PE 风险投资 Venture Capital VC 私募股权投资 Private Equity PE 3 买方
  • Apache2.4.23--解析漏洞

    复现环境 Apache文件解析漏洞与用户的配置有密切关系 严格来说属于用户配置问题 Apache文件解析漏洞涉及到一个解析文件的特性 Apache默认 个文件可以有多个以点分隔的后缀 当右边的后缀无法识别 则继续向左识别 发现后缀是 php
  • 强大的JTAG边界扫描(4):STM32边界扫描应用

    文章目录 1 获取芯片的BSDL文件 2 硬件连接 3 边界扫描测试 4 总结 试想这样一个场景 我们新设计了一款集成了很多芯片的板卡 包括BGA封装的微控制器 如FPGA MCU 还有LED 按键 串口 传感器 ADC等基本外设 我们需要
  • Unity 导出的EXE文件关闭时卡死崩溃

    Unity 导出的EXE文件关闭时崩溃 前言 项目分析情况 解决方法一 结论 前言 这个问题出现在Unity导出的可执行文件发生在需要关闭应用程序时无法正常关闭 只能从任务管理器中直接杀死进程 虽然这一步的目的是关闭程序但无法走正常途径就很
  • kettle中时间转换日期格式

    为什么80 的码农都做不了架构师 gt gt gt 经常会用到获取今天日期 但是在kettle中没有日期格式 只有时间格式 我们只有把时间格式转换成日期格式 第一步获取系统信息 第二步选择 改名值 第三步打印输出即可 转载于 https m
  • 【Java入门】统计字符串中“ a ~ z “各个字符出现的次数

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 知识点 二 代码 三 运行截图 前言 入门版统计字符串中 a z 各个字符出现的次数 如果需要查询某个字符出现的次数可以写成一个方法 一 知识点 Scan
  • 微信小程序实现文字长按复制、一键复制功能

    一 不引入外部组件的实现方式
  • 将mysql服务启动类型设置为手动或自动提示拒绝访问

    可能被360或者火绒禁止了 直接去火绒 安全工具 启动项管理 服务项 显示禁用的启动项 找到Mysql56允许启动 这里说一下打开Mysql服务的命令 net start mysql56 卸载mysql服务还在 需要删除mysql服务 sc
  • 一张图看懂数据结构-——图

    最小生成树 Prim算法 图解 一些说明 min weight数组表示该集合到达剩余顶点的最小值 adjvex表示这个最小权值是由哪个顶点引入 每次选取最小的权值顶点加入后 需要更新min weight的数值 选取值变为0 全部都为0时表示
  • 时间序列分析-ARIMA模型

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 时间序列分析 ARIMA模型 概述 一 时间序列平稳性 1 严平稳 2 弱平稳 二 建模步骤 1 平稳性检验 2 人工p 和 q 阶数的确定 3 模型拟合AIC和BIC确定最
  • BUUCTF zip伪加密(发现伪加密的惊天大秘密)

    title BUUCTF zip伪加密 date 2021年8月18日 20点03分 tags BUUCTF Misc categories BUUCTF Misc 这道题我为何要单独拿出来写呢 因为我在解题的途中 发现了zip伪加密的惊天
  • 2017年河北秦皇岛天气数据的R语言分析报告

    1 背景 AQI就是各项污染物空气质量分指数中的最大值 当AQI大于50时 IAQI最大的污染物为首要污染物 若IAQI最大的污染物为两项或两项以上时 并列为首要污染物 空气质量指数 综合表示空气污染程度或空气质量等级的无量纲的相对数值 数
  • JEECG online表单代码生成菜单授权后,提示“没有权限,请联系管理员授权”

    JEECG online表单代码生成菜单授权后 提示 没有权限 请联系管理员授权 参考官方文档 http doc jeecg com 2044037 一 不添加按钮 权限 找到生成代码路径中的controller中的java文件进行队jav
  • pandas数据分组与聚合

    目录 1 数据分组 1 1 按列名分组 1 2按列表或元组分组 1 3 按字典分组 1 4按函数分组
  • Linux多线程编程知识汇总!

    大家好 我杂烩君 什么是多线程编程 1 线程和进程的区别 进程是指正在运行的程序 它拥有独立的内存空间和系统资源 不同进程之间的数据不共享 线程是进程内的执行单元 它与同一进程内的其他线程共享进程的内存空间和系统资源 2 多线程的优势和应用
  • 计算机网络-应用层协议5(P2P)

    本文介绍两种特别适合P2P设计的应用 第一种是文件分发 从单个源向大量对等方分发一个文件 特殊例子BitTorrent 第二种P2P应用是分布在大型对等社区中的数据库 重点讨论分布式散列表 DHT 的概念 1 P2P文件分发 首先介绍文件分
  • Windows中卷(Volume)操作,获取卷GUID、磁盘类型、磁盘大小等API

    Windows中卷 Volume 操作 1 阅读msdn整理卷相关的知识点 https docs microsoft com zh cn windows win32 fileio volume management 2 重点讲解几个常用的A