多语言展示
当前在线:1481今日阅读:27今日分享:41

C#如何读取磁盘扇区

介绍使用C#调用Win32 API,实现读取磁盘扇区的方法。Win32 API中的ReadFile可以读取设备/Socket等多种对象。
工具/原料

Visual Studio 2015(C#)

方法/步骤
1

要调用Win32 API,首先要知道API中的参数怎么用。因为使用C编程时,在头文件winnt.h中声明有Win32 API需要的常量,可是C#的编程环境中是没有的,因此我们可以从这个头文件查看常匠耻量,然后自己写uint类型枚举如图,代替C/C++中的宏定义。

2

第一个用到的函数:CreateFile上边几个就是CreateFile函数往裁改需要用到的常量。uint类型的枚举可以直接代替uint类型作为传入参数。

3

第二个用到的函数:SetFilePointer使用CreateFile创建句柄后,用这个设置读指针位置。如图的MoveMethodMode就是自己定义的uint类型枚举常量。引用变量写成[In, Out] ref...SetLastError属性则可有可无,设置这个是为了能够在失败时获取Win32错误。

4

第三个/第四个用到的函数:ReadFile,CloseHandle。分别用来读取,和关闭句柄。

6

首先如图调用CreateFile,各个参数如图设置即可。如果diskHandle得到-1,就是创建失败,弹窗娃佛显示(显示信息有小问题,是不是\\.\PHYSICALDRIVE0取决于调用函数者)

7

然后从sector计算文件指针的第32位和高32位。使用SetFilePointer设置指针位置。

8

如果返回0xffffffff,就说明设置失败,返回。如果成功,继续,调用ReadFile读取内容到缓冲区。然后关闭句柄,返回读取成功。

9

然后我们在事件处理函数中,就可以如图读取扇区,接着格式化并显示出来。

10

直接运行可能失败,我们需要开启这个程序的管理员权限要求。这里简单说明如图,若有问题请查阅别处。

11

接下来,我们把自己写的读盘程序,和一些现有软件做比较,可以看到读取结果正确。

注意事项
1

关于以上几个Win32 API的详细用法,可以查阅别处,这篇经验的重点在于如何在C#中使用它们。

2

使用DllImport只能引入方法,而且写在自己的类内,成为类的成员。

推荐信息