vc++如何获取磁盘信息

vc++如何获取磁盘信息,第1张

如果是windows下,你可以查找"精通WindowsAPI-函数、接口、编程实例pdf"第四章文件系统中的内容。

421 遍历卷并获取属性

获取一个主机上的所有驱动器列表有两种方法,一种是使用 GetLogicalDrives 或

GetLogicalDriveStrings,另一种是使用 FindFirstVolume 和 FindNextVolume 组合。

第一种方法获取主机上的逻辑驱动器,也就是所有分配的卷标的驱动器,返回的结果是

驱动器的根路径。第二种方法返回的是“\\\volume{GUID}”形式的驱动器设备名。

使用 GetDriveType API 可以获取驱动器类型,使用 GetVolumeInformation 可以获取驱

动器属性。

1.关键 API

(1) GetLogicalDrives。

获取主机中所有的逻辑驱动器,以 BitMap 的形式返回,其函数原型如下:

◇返回值

GetLogicalDrive 函数返回一个 DWORD 类型的值,第一位表示所对应的驱动器是否存在。

一般情况下 DWORD 的数据长度是 32 位,在这个 DWORD 中,每一位对应了一个逻辑驱动器是

否存在。第二位如果是“1”则表示驱动器“B:”存在,第 4 位如果是“1”则表示驱动器

“D:”是存在的,以此类推。

(2) GetLogicalDriverStrings。

获取主机中所有驱动器,以驱动器根路径字符串返回,其函数原型如下:

◇参数

nBufferLength:参数 lpBuffer 所指向的内存空间的大小,以字节为单位。

lpBuffer:指向存储返回结果字符串的内存空间。

◇返回值

函数的返回值指明了函数调用是否成功,如果成功则返回缓冲区中返回结果的总长度。

如果返回值大于 nBufferLength,说明给定的缓冲区大小不够,返回值是实际需要的大小。

如果返回 0,则说明函数运行出错。

◇使用说明

这个 API 实现了与 GetLogicalDrives 同样的功能,却以一种更直观的方式返回执行结

果。函数执行结果放在 lpBuffer 所指向的内存区域中,此内存区域大小由 nBufferLength

参数指定,使函数返回结果不至于溢出。在调用此函数前需保证内存分配。

函数调用成功后,将在缓冲区中依次填入本机所具有的驱动器根路径字符串,如在笔者

系统中有 5 个逻辑驱动器“C:\”、“D:\”“E:\”、“F:\”、“I:\”。执行后在缓冲

区中的结果如下:

也就是连续放置了“C:\”、“D:\”“E:\”、“F:\”、“I:\”这 5 个字符串(会

在每个字符串后加一个‘\o’结束符,在所有卷标字符串的最后再加一个结束符)。

(3)FindFirstVolume。

查找主机中的第一个驱动器,返回驱动器设备名,其函数原型如下:

◇参数

lpszVolumeName:指向驱动器名的内存缓冲区。

cchBufferLength:参数 lpszVolumeName 所指向的缓冲区大小,以字节为单位。

◇返回值

驱动器查找句柄, F 猫 NextVolume 和 FindVolumeColse 的参数, 如果执行失败, 返回 NULL。

(4)FindNextVolume

查找主机中后继的逻辑驱动器,其函数原型如下:

◇参数

hFindVolume: FindFirstVolume 所返回的驱动器查找句柄。

lpszVolumeName:指向保存驱动器名的内存缓冲区。

cchBufferLength:参数 lpszVolumeName 所指向的缓冲区大小,以字节为单位。

◇返回值

返回 BOOL 表示是否成功,如果失败说明已经查找完成所有逻辑驱动器。

(5)FindVo1umeClose。

\关闭 FindFirstVolume 打开的卷遍历句柄,其函数原型如下:

◇参数

hFindVolume:要关闭的驱动器查找句柄。

◇返回值

返回 BOOL 值表示是否成功关闭句柄。

(6) GetDriveType。

获取驱动器类型,其函数原型如下:

◇参数

lpRootPathIName:驱动器根路径,如“C:\”。

◇返回值 /

驱动器的类型,如 DRIVE' FIXED 表示硬盘,DRIVE_CDROM 表示光盘等。详见实例 4-2

的 GetDirverInfo 函数。

(7) GetVolumeInformation。

获取逻辑驱动器信息,其函数原型如下:

◇参数

lpRootPathName:输入参数,指向所要获取属性的驱动器的根路径字符串。

lpVolumeNameBuffer:输出参数,返回驱动器名。

可以通过系统自带工具分区

通过搜索框输入或右击Windows菜单选择进入“磁盘管理”,右击C盘选择压缩卷:

提示“正在查询卷以获取可用压缩空间,请稍后…”耐心等待片刻后出现可用压缩空间大小。以压缩300GB出来为例,计算300GB1024=307200,在此基础上多加10MB或者20MB,防止被分区表占去空间后分出2999GB不美观。

点击压缩后出现未分配的空间,右击选择“新建简单卷”

根据提示下一步,如果只分一个盘容量不需要改,如果想将未分配空间再分成多个区,就先写当前分区所需要的容量大小。

这里的驱动器号默认为E(因为D盘已经被光驱占用了。有强迫症的朋友们,可以回到磁盘管理页面右击光驱,选择更改驱动器号和路径,将D改为后面的字母,将D的位置留出来,然后此处可将E盘改成D盘)

在“卷标”处输入分区命名后选下一步(后续也可在此电脑中右击进行重命名)

点击完成后等待片刻,大功告成

您好:

完全要以在不重装系统的情况下分盘,按下面步骤完全可以

使用windows——win7 自带分区工具

1、在桌面右键点击“计算机”-“管理”, 打开的计算机管理窗口,在打开的计算机管理窗口的左侧,鼠标左键单击选“磁盘管理”打开磁盘管理窗口。

2、右击要压缩的主分区C-选“压缩卷”-等待系统完成查询可用压缩空间,在压缩对话框,在显示“压缩前的总计大小”和“可用压缩空间大小”下的“输入压缩空间量”中指定分出来的容量,点击“压缩”,再点击“是”。

3、创建新分区,鼠标右键点击前面 *** 作得到的”未分配”空间,选“新建简单卷”,打开“欢迎使用新建简单卷向导”对话框,打“下一步”。

4、指定卷标大小,根据需要在“简单卷大小”输入想要创建分区的大小,点击“下一步”。

5、分配驱动器号和路径,写入盘符号后, 点击“下一步”。

6、格式化分区,点选“按下列设置格式化这个分区”:

“文件系统”,选“NTFS”;

“分配单位大小”,选“默认”;

“卷标”,,默认是“新加卷”;

勾选“执行快速格式化”, 点击“下一步”。

7、点击“完成”,格式化后显示“状态良好”,分区完成。

问了一下我远标出来的程序员哥们,她说,你看下对不对

swing下的包,javaxswingfilechooserFileSystemView;可以获取:

FileSystemView fileSys=FileSystemViewgetFileSystemView(); //获取当前系统文件类型

//获取系统的所有盘符或系统卷类型

for(File f:FilelistRoots()){

Systemoutprintln(fileSysgetSystemDisplayName(f));//获取系统卷标及名字

Systemoutprintln(fileSysgetSystemTypeDescription(f));//获取系统卷的类型

Systemoutprintln(fgetTotalSpace());//获取该卷大小(单位:字节)

Systemoutprintln(fgetFreeSpace());//获取该卷可用大小(单位:字节)

}

C/C++ code QString lpRootPathName = "C:\\";

LPTSTR lpVolumeNameBuffer=new TCHAR[12];//磁盘卷标

DWORD nVolumeNameSize=12;// 卷标的字符串长度

DWORD VolumeSerialNumber;//硬盘序列号

DWORD MaximumComponentLength;// 最大的文件长度

LPTSTR lpFileSystemNameBuffer=new TCHAR[10];// 存储所在盘符的分区类型的长指针变量

DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度

DWORD FileSystemFlags;// 文件系统的一此标志

GetVolumeInformation((LPTSTR)lpRootPathNameutf16(),

lpVolumeNameBuffer, nVolumeNameSize,

&VolumeSerialNumber, &MaximumComponentLength,

&FileSystemFlags,

lpFileSystemNameBuffer, nFileSystemNameSize);

qDebug() << VolumeSerialNumber;

硬盘基础知识

硬盘的DOS管理结构

1磁道,扇区,柱面和磁头

硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可

记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储128×2的N次方(N=0123)字节信息。在DOS

中每扇区是128×2的2次方=512字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径

的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁

盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些

参数可以得到硬盘的容量,基计算公式为:

存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数

要点:(1)硬盘有数个盘片,每盘片两个面,每个面一个磁头

(2)盘片被划分为多个扇形区域即扇区

(3)同一盘片不同半径的同心圆为磁道

(4)不同盘片相同半径构成的圆柱面即柱面

(5)公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数

(6)信息记录可表示为:××磁道(柱面),××磁头,××扇区

2簇

“簇”是DOS进行分配的最小单位。当创建一个很小的文件时,如是一个字节,则它在磁盘上并不是只占一个字节的空间,

而是占有整个一簇。DOS视不同的存储介质(如软盘,硬盘),不同容量的硬盘,簇的大小也不一样。簇的大小可在称为磁盘

参数块(BPB)中获取。簇的概念仅适用于数据区。

本点:(1)“簇”是DOS进行分配的最小单位。

(2)不同的存储介质,不同容量的硬盘,不同的DOS版本,簇的大小也不一样。

(3)簇的概念仅适用于数据区。

3扇区编号定义:绝对扇区与DOS扇区

由前面介绍可知,我们可以用柱面/磁头/扇区来唯一定位磁盘上每一个区域,或是说柱面/磁头/扇区与磁盘上每一个扇区有 一一对应关系,通常DOS将“柱面/磁头/扇区”这样表示法称为“绝对扇区”表示法。但DOS不能直接使用绝对扇区进行磁盘上的信息管理,而是用所谓“相对扇区”或“DOS扇区”。“相对扇区”只是一个数字,如柱面140,磁头3,扇区4对应的相对扇区号 为2757。该数字与绝对扇区“柱面/磁头/扇区”具有一一对应关系。当使用相对扇区编号时,DOS是从柱面0,磁头1,扇区1开始 (注:柱面0,磁头0,扇区1没有DOS扇区编号,DOS下不能访问,只能调用BIOS访问),第一个DOS扇区编号为0,该磁道上剩余 的扇区编号为1到16(设每磁道17个扇区),然后是磁头号为2,柱面为0的17个扇区,形成的DOS扇区号从17到33。直到该柱面的 所有磁头。然后再移到柱面1,磁头1,扇区1继续进行DOS扇区的编号,即按扇区号,磁头号,柱面号(磁道号)增长的顺序连续地分配DOS扇区号。

公式:记DH--第一个DOS扇区的磁头号

DC--第一个DOS扇区的柱面号

DS--第一个DOS扇区的扇区号

NS--每磁道扇区数

NH--磁盘总的磁头数

则某扇区(柱面C,磁头H,扇区S)的相对扇区号RS为:

RS=NH×NS×(C-DC)+NS×(H-DH)+(S-DS)

若已知RS,DC,DH,DS,NS和NH则

S=(RS MOD NS)+DS

H=((RS DIV NS)MOD NH)+DH

C=((RS DIV NS)DIV NH)+DC

要点:(1)以柱面/磁头/扇区表示的为绝对扇区又称物理磁盘地址

(2)单一数字表示的为相对扇区或DOS扇区,又称逻辑扇区号

(3)相对扇区与绝对扇区的转换公式

4DOS磁盘区域的划分

格式化好的硬盘,整个磁盘按所记录数据的作用不同可分为主引导记录(MBR:Main Boot Record),Dos引导记录(DBR:Dos Boot Record),文件分配表(FAT:File Assign Table),根目录(BD:Boot Directory)和数据区。前5个重要信息在磁盘的外磁道上,原因是外圈周长总大于内圈周长,也即外圈存储密度要小些,可靠性高些。

要点:(1)整个硬盘可分为MBR,DBR,FAT,BD和数据区。

(2)MBR,DBR,FAT,和BD位于磁盘外道。

5 MBR

MBR位于硬盘第一个物理扇区(绝对扇区)柱面0,磁头0,扇区1处。由于DOS是由柱面0,磁头1,扇区1开始,故MBR不属于 DOS扇区,DOS不能直接访问。MBR中包含硬盘的主引导程序和硬盘分区表。分区表有4个分区记录区。记录区就是记录有关分区信 息的一张表。它从主引导记录偏移地址01BEH处连续存放,每个分区记录区占16个字节。

分区表的格式

分区表项的偏移 意义 占用字节数

00 引导指示符 1B

01 分区引导记录的磁头号 1B

02 分区引导记录的扇区和柱面号 2B

04 系统指示符 1B

05 分区结束磁头号 1B

06 分区结束扇区和柱面号 2B

08 分区前面的扇区数 4B

0C 分区中总的扇区数 4B

4个分区中只能有1个活跃分区,即C盘。标志符是80H在分区表的第一个字节处。若是00H则表示非活跃分区。例如:

80 01 01 00 0B FE 3F 81 3F 00 00 00 C3 DD 1F 00

00 00 01 82 05 FE BF 0C 02 DE 1F 00 0E 90 61 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

要点:(1)MBR位于硬盘第一个物理扇区柱面0,磁头0,扇区1处。不属于DOS扇区,

(2)主引导记录分为硬盘的主引导程序和硬盘分区表。

6DBR

DBR位于柱面0,磁头1,扇区1,即逻辑扇区0。DBR分为两部分:DOS引导程序和BPB(BIOS参数块)。其中DOS引导程序完成

DOS系统文件(IOSYS,MSDOSSYS)的定位与装载,而BPB用来描述本DOS分区的磁盘信息,BPB位于DBR偏移0BH处,共13字节。 它包含逻辑格式化时使用的参数,可供DOS计算磁盘上的文件分配表,目录区和数据区的起始地址,BPB之后三个字提供物理格式化(低格)时采用的一些参数。引导程序或设备驱动程序根据这些信息将磁盘逻辑地址(DOS扇区号)转换成物理地址(绝对

扇区号)。BPB格式

序号 偏移地址 意义

1 03H-0AH OEM号

2 0BH-0CH 每扇区字节数

3 0DH 每簇扇区数

4 0EH-0FH 保留扇区数

5 10H FAT备份数

6 11H-12H 根目录项数

7 13H-14H 磁盘总扇区数

8 15H 描述介质

9 16H-17H 每FAT扇区数

10 18H-19H 每磁道扇区数

11 1AH-1BH 磁头数

12 1CH-1FH 特殊隐含扇区数

13 20H-23H 总扇区数

14 24H-25H 物理驱动器数

15 26H 扩展引导签证

16 27H-2AH 卷系列号

17 2BH-35H 卷标号

18 36H-3DH 文件系统号

DOS引导记录公式:

文件分配表≡保留扇区数

根目录≡保留扇区数+FAT的个数×每个FAT的扇区数

数据区≡根目录逻辑扇区号+(32×根目录中目录项数+(每扇区字节数-1))DIV每扇区字节数

绝对扇区号≡逻辑扇区号+隐含扇区数

扇区号≡(绝对扇区号MOD每磁道扇区数)+1

磁头号≡(绝对扇区号DIV每磁道扇区数)MOD磁头数

磁道号≡(绝对扇区号DIV每磁道扇区数)DIV磁头数

要点:(1)DBR位于柱面0,磁头1,扇区1,其逻辑扇区号为0

(2)DBR包含DOS引导程序和BPB。

(3)BPB十分重要,由此可算出逻辑地址与物理地址。

7文件分配表

文件分配表是DOS文件组织结构的主要组成部分。我们知道DOS进行分配的最基本单位是簇。文件分配表是反映硬盘上所

有簇的使用情况,通过查文件分配表可以得知任一簇的使用情况。DOS在给一个文件分配空间时总先扫描FAT,找到第一个可 用簇,将该空间分配给文件,并将该簇的簇号填到目录的相应段内。即形成了“簇号链”。FAT就是记录文件簇号的一张表。FAT的头两个域为保留域,对FAT12来说是3个字节,FAT来说是4个字节。其中头一个字节是用来描述介质的,其余字节为FFH 。介质格式与BPB相同。

第一个字节的8位意义:

7 6 5 4 3 2 1 0

└—————-┘ │ │ │┌0非双面

置1 │ │ └┤

│ │ └1双面

│ │┌0不是8扇区

│ └┤

│ └1是8扇区

│┌0不是可换的

└┤

└1是可换的

FAT结构含义

FAT12 FAT16 意义

000H 0000H 可用

FF0H-FF6H FFF0H-FFF6H 保留

FF7H FFF7H 坏

FF8H-FFFH FFF8H-FFFFH 文件最后一个簇

×××H ××××H 文件下一个簇

对于FAT16,簇号×2作偏移地址,从FAT中取出一字即为FAT中的域。

逻辑扇区号=数据区起始逻辑扇区号+(簇号-2)×每簇扇区数

簇号=(逻辑扇区号-数据区起始逻辑扇区号)DIV每簇扇区数+2

要点:(1)FAT反映硬盘上所有簇的使用情况,它记录了文件在硬盘中具体位置(簇)。

(2)文件第一个簇号(在目录表中)和FAT的该文件的簇号串起来形成文件的“簇号链”,恢复被破坏的文件就是根

据这条链。

(3)由簇号可算逻辑扇区号,反之,由逻辑扇区号也可以算出簇号,公式如上。

(4)FAT位于DBR之后,其DOS扇区号从1开始。

8文件目录

文件目录是DOS文件组织结构的又一重要组成部分。文件目录分为两类:根目录,子目录。根目录有一个,子目录可以有 多个。子目录下还可以有子目录,从而形成“树状”的文件目录结构。子目录其实是一种特殊的文件,DOS为目录项分配32字 节。目录项分为三类:文件,子目录(其内容是许多目录项),卷标(只能在根目录,只有一个。目录项中有文件(或子目 录,或卷标)的名字,扩展名,属性,生成或最后修改日期,时间,开始簇号,及文件大小。 目录项的格式字节偏移 意义 占字节数

00H 文件名 8B

08H 扩展名 3B

0BH 文件属性 1B

0CH 保留 10B

16H 时间 2B

18H 日期 2B

1AH 开始簇号 2B

1CH 文件长度 4B

目录项文件名区域中第一个字节还有特殊的意义:00H代表未使用

05H代表实际名为E5H

EBH代表此文件已被删除

目录项属性区域的这个字节各个位的意义如下: 7 6 5 4 3 2 1 0

未 修 修 子 卷 系 隐 只

用 改 改 目 标 统 藏 读

标 标 录 属 属 属

志 志 性 性 性

注意:WINDOWS的长文件名使用了上表中所说的“保留”这片区域。

要点:(1)文件目录是记录所有文件,子目录名,扩展名属性,建立或删除最后修改日期。文件开始簇号及文件长度的一张

登记表

(2)DOS中DIR列出的内容训是根据文件目录表得到的。

(3)文件起始簇号填在文件目录中,其余簇都填在FAT中上一簇的位置上。

9物理驱动器与逻辑驱动器

物理驱动器指实际安装的驱动器。

逻辑驱动器是对物理驱动器格式化后产生的

以上就是关于vc++如何获取磁盘信息全部的内容,包括:vc++如何获取磁盘信息、新买的笔记本电脑怎么分区、无法获取分区信息,不能继续怎么弄啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10039458.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存