实验10 获取磁盘基本信息

一、实验目的

(1) 了解磁盘的物理组织。
(2) 熟悉Windows 系统如何查看磁盘相关系数。
(3) 掌握Windows 系统提供的有关对磁盘操作 API。

二、实验准备

磁盘基本物理结构原型:
	Typedef struct_DTSK_GEOMETRY {
	LARGE_INTEGER  Cylinders ;
	MEDIA_TYPE MediaType ;
	DWORD  TracksPerCylinder ;
	DWORD  SectorsPerTrack ;
	DWORD  BytesPerSector ;
	} DISK_GEOMETRY ;
 CreateFile()                文件创建:用于打开磁盘驱动器并返回一个文件句柄
 DeviceIoControl()           获取磁盘的基本信息
 GetLastError()              得到更多的错误信息

三、实验内容

(一)实验内容

   编写一个函数,根据给出的驱动器号读取磁盘基本信息,包括键盘的大小、该磁盘包括多少个扇区,该磁盘有多少个柱面,
每个柱面的磁道数、每个磁道的扇区数、每个扇区包含的字节数。

(二)主要代码

// 10.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "winioctl.h"
#include "10.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DISK_GEOMETRY disk_info;
HANDLE GetDiskInformation(char drivername);
BOOL SectorRead(HANDLE Handle);
BOOL SectorWrite(HANDLE Handle);
/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode=0;
	HANDLE Handle;
	//调用自定义函数获取磁盘C信息
	Handle=GetDiskInformation('C');
	return nRetCode;
}
//自定义获取磁盘信息函数
HANDLE GetDiskInformation(char drivername)
{
	char device[]="\\\\.\\C:"; 
	device[4]=drivername;
	HANDLE FloopyDisk;
	DWORD ReturnSize;
	DWORD Sector;
	double DiskSize;
	FloopyDisk=CreateFile(device,
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_RANDOM_ACCESS|FILE_FLAG_NO_BUFFERING,
		NULL);
	//判断句柄是否有效
	if(FloopyDisk==INVALID_HANDLE_VALUE)
		printf("INVALID_HANDLE_VALVE!\n");
	//错误处理
	if(GetLastError()==ERROR_ALREADY_EXISTS)
		printf("Can not Open Disk!%d\n",GetLastError());
	//获取磁盘信息,并判断获取是否成功
	if (!DeviceIoControl(FloopyDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,
		NULL,
		0,
		&disk_info,
		50,
		&ReturnSize,
		(LPOVERLAPPED)NULL))
		printf("Open Disk Error!%d\n", GetLastError());
	//输出磁盘各信息
	printf("Disk Information:\n");
	printf("\tBytesPerSector:%d\n",disk_info.BytesPerSector);
	printf("\tSectorPerTrack:%d\n",disk_info.SectorsPerTrack);
	printf("\tTrackPerCylinder:%d\n",disk_info.TracksPerCylinder);
	printf("\tCylinder: %d\n", disk_info.Cylinders);
	Sector= disk_info. Cylinders.QuadPart* disk_info. TracksPerCylinder* disk_info. SectorsPerTrack;
	printf("\tThere is %d Sectors!\n", Sector);
	DiskSize=Sector*disk_info. BytesPerSector;
	printf("\tSize of Disk: %4.2fMB\n",(DiskSize)/(1024*1024));
	return FloopyDisk;
}


四、实验结果与总结(遇到的问题及解决方法)

总结:由于实验要使用的主要数据结构DISK_GEOMETRY 是由系统提供的,其声明在#include "winioctl.h"中,因此要将其加入到
     实验程序的头文件说明中,否则程序编译时系统将无法识别DISK_GEOMETRY结构。
遇到的问题:一开始直接将#include "winioctl.h"放在了代码最开始的部分,出现编译错误,开始尝试修改,发现需将#include 
          "winioctl.h"放在#include "stdafx.h"后,方可编译运行成功。

实验结果截图:
image

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐