windows如何获取物理磁盘未分配的空间

时间:2022-09-02 00:29:44
1.在磁盘管理中可以看到黑色条框的磁盘未分配空间,说明windows支持这类信息。
2.调用windowsAPI函数只能获取磁盘总容量和各个分区的容量,但无法准确知道是否存在未分配空间,未分配空间的具体大小是多少。
求大神,帮忙解答。

9 个解决方案

#1


不太懂,但是我觉得这个总量减去各个分区量的和不就是未分配的空间大小吗?

#2


能够分享下,是怎么调用windowsAPI函数获取磁盘总容量(总共的 字节数)及调用的是哪些API函数?正好碰到这个需求,先前并没接触过这块知识。谢谢了

#3


引用 1楼轻箬笠 的回复:
不太懂,但是我觉得这个总量减去各个分区量的和不就是未分配的空间大小吗?
理论上是可以这样的,但是各分区容量都有几兆的保留区。这样算出来的容量只能是个大概,不准确。
还有一个问题就是,这个想减得到的这个数字,你并不能确定是分区保留的,还是未分配的。

#4


引用 1 楼 housecarl 的回复:
不太懂,但是我觉得这个总量减去各个分区量的和不就是未分配的空间大小吗?

理论上是可以这样的,但是各物理磁盘容量都有几兆的保留区用于存储各分区信息。这样算出来的容量只能是个大概,不准确。 还有一个问题就是,这个想减得到的这个数字,你并不能确定是磁盘保留的,还是未分配的。

#5


GetDiskFreeSpaceEx

#6


lz可以用这个试试,
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&layOutInfo,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20,&bytesReturned,NULL)
根据layOutInfo里面每个分区的偏移地址layOutInfo[0].PartitionEntry[i].StartingOffset和分区长度layOutInfo[0].PartitionEntry[i].PartitionLength估算两个分区间未分配的空间大小。
如果两者之间没有未分配的空间的话,layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength=layOutInfo[0].PartitionEntry[i+1].StartingOffset。
如果存在未分配的空间的话,那么未分配空间的大小为:size=layOutInfo[0].PartitionEntry[i+1].StartingOffset-(layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength).

#7


引用 2 楼 my_xxh 的回复:
能够分享下,是怎么调用windowsAPI函数获取磁盘总容量(总共的 字节数)及调用的是哪些API函数?正好碰到这个需求,先前并没接触过这块知识。谢谢了

获取磁盘总容量可以用 
DISK_GEOMETRY_EX geoStruct;
 memset(&geoStruct,0,sizeof(geoStruct));
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ,NULL,0,&geoStruct,sizeof(geoStruct),&bytesReturned,NULL)
网址http://www.cppblog.com/dingding/archive/2008/09/23/62570.html

#8


引用 6楼轻箬笠 的回复:
lz可以用这个试试,
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&layOutInfo,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20,&bytesReturned,NULL)
根据layOutInfo里面每个分区的偏移地址layOutInfo[0].PartitionEntry[i].StartingOffset和分区长度layOutInfo[0].PartitionEntry[i].PartitionLength估算两个分区间未分配的空间大小。
如果两者之间没有未分配的空间的话,layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength=layOutInfo[0].PartitionEntry[i+1].StartingOffset。
如果存在未分配的空间的话,那么未分配空间的大小为:size=layOutInfo[0].PartitionEntry[i+1].StartingOffset-(layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength).
Good idea.现在最头疼的是未分配空间出现在磁盘扇区最开始的位置。我可以过去第一个分区的偏移量,但正常的磁盘第一个分区也会有个几兆的偏移量。所以就不好判断这个是必然磁盘本身正常的偏移量还是未被分配的空间。我就想知道系统是怎么把这块未分配挑出来的?有没有提供什么API给我们?

#9


不知道那些分区软件是怎么实现未分配空间的晒选的?
求大神指教啊。

#1


不太懂,但是我觉得这个总量减去各个分区量的和不就是未分配的空间大小吗?

#2


能够分享下,是怎么调用windowsAPI函数获取磁盘总容量(总共的 字节数)及调用的是哪些API函数?正好碰到这个需求,先前并没接触过这块知识。谢谢了

#3


引用 1楼轻箬笠 的回复:
不太懂,但是我觉得这个总量减去各个分区量的和不就是未分配的空间大小吗?
理论上是可以这样的,但是各分区容量都有几兆的保留区。这样算出来的容量只能是个大概,不准确。
还有一个问题就是,这个想减得到的这个数字,你并不能确定是分区保留的,还是未分配的。

#4


引用 1 楼 housecarl 的回复:
不太懂,但是我觉得这个总量减去各个分区量的和不就是未分配的空间大小吗?

理论上是可以这样的,但是各物理磁盘容量都有几兆的保留区用于存储各分区信息。这样算出来的容量只能是个大概,不准确。 还有一个问题就是,这个想减得到的这个数字,你并不能确定是磁盘保留的,还是未分配的。

#5


GetDiskFreeSpaceEx

#6


lz可以用这个试试,
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&layOutInfo,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20,&bytesReturned,NULL)
根据layOutInfo里面每个分区的偏移地址layOutInfo[0].PartitionEntry[i].StartingOffset和分区长度layOutInfo[0].PartitionEntry[i].PartitionLength估算两个分区间未分配的空间大小。
如果两者之间没有未分配的空间的话,layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength=layOutInfo[0].PartitionEntry[i+1].StartingOffset。
如果存在未分配的空间的话,那么未分配空间的大小为:size=layOutInfo[0].PartitionEntry[i+1].StartingOffset-(layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength).

#7


引用 2 楼 my_xxh 的回复:
能够分享下,是怎么调用windowsAPI函数获取磁盘总容量(总共的 字节数)及调用的是哪些API函数?正好碰到这个需求,先前并没接触过这块知识。谢谢了

获取磁盘总容量可以用 
DISK_GEOMETRY_EX geoStruct;
 memset(&geoStruct,0,sizeof(geoStruct));
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX ,NULL,0,&geoStruct,sizeof(geoStruct),&bytesReturned,NULL)
网址http://www.cppblog.com/dingding/archive/2008/09/23/62570.html

#8


引用 6楼轻箬笠 的回复:
lz可以用这个试试,
DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,NULL,0,&layOutInfo,sizeof(DRIVE_LAYOUT_INFORMATION_EX)*20,&bytesReturned,NULL)
根据layOutInfo里面每个分区的偏移地址layOutInfo[0].PartitionEntry[i].StartingOffset和分区长度layOutInfo[0].PartitionEntry[i].PartitionLength估算两个分区间未分配的空间大小。
如果两者之间没有未分配的空间的话,layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength=layOutInfo[0].PartitionEntry[i+1].StartingOffset。
如果存在未分配的空间的话,那么未分配空间的大小为:size=layOutInfo[0].PartitionEntry[i+1].StartingOffset-(layOutInfo[0].PartitionEntry[i].StartingOffset+layOutInfo[0].PartitionEntry[i].PartitionLength).
Good idea.现在最头疼的是未分配空间出现在磁盘扇区最开始的位置。我可以过去第一个分区的偏移量,但正常的磁盘第一个分区也会有个几兆的偏移量。所以就不好判断这个是必然磁盘本身正常的偏移量还是未被分配的空间。我就想知道系统是怎么把这块未分配挑出来的?有没有提供什么API给我们?

#9


不知道那些分区软件是怎么实现未分配空间的晒选的?
求大神指教啊。