C# 如何逐位读取整个磁盘的内容

C# 如何逐位读取整个磁盘的内容,c#,c++,C#,C++,我有一个闪存卡,我需要计算整个硬盘内容的校验和 如果我可以获取整个驱动器的流,我就可以一点一点地读取它 有人知道有没有API可以实现这一点吗 到目前为止,我看到的一切都需要我打开一个文件 有没有办法一点一点地读取整个驱动器的内容?我不确定在.NET中是否有直接的支持,但是您可以使用来调用Win32 API函数。应该是您的起点,因为它允许您获得物理驱动器的句柄: 您可以使用CreateFile函数打开物理磁盘驱动器或卷,其中 返回可与一起使用的直接访问存储设备(DASD)句柄 设备控制功能。这使您

我有一个闪存卡,我需要计算整个硬盘内容的校验和

如果我可以获取整个驱动器的流,我就可以一点一点地读取它

有人知道有没有API可以实现这一点吗

到目前为止,我看到的一切都需要我打开一个文件


有没有办法一点一点地读取整个驱动器的内容?

我不确定在
.NET
中是否有直接的支持,但是您可以使用来调用Win32 API函数。应该是您的起点,因为它允许您获得物理驱动器的句柄:

您可以使用CreateFile函数打开物理磁盘驱动器或卷,其中 返回可与一起使用的直接访问存储设备(DASD)句柄 设备控制功能。这使您能够直接访问磁盘或卷,例如 例如磁盘元数据,如分区表

文档会告知您一些限制(如需要管理权限)并提示如何从卷号中获取物理驱动器号等。

流是一种抽象,通常假定存在文件系统,因此从概念上讲,它并不像那样简单

在Windows上,您可能希望从查看Windows碎片整理API开始。以下是我发现的几个链接:

如果您想编写C代码,那么您必须使用p/Invoke从磁盘读取数据(原始访问)

有没有办法一点一点地读取整个驱动器的内容

您必须在驱动器闪存卡的逻辑表示,其中安装了文件系统,由驱动器号指定)和磁盘之间进行区分(闪存卡的物理表示,由磁盘号指定)

请参阅关于如何从驱动器/磁盘读取原始数据:

基本上,首先需要磁盘/驱动器的句柄:

// For a DISK:
IntPtr hDisk = CreateFile(string.Format("\\\\.\\PhysicalDrive{0}", diskNumber),
    GenericRead,
    Read | Write,
    0,
    OpenExisting,
    0,
    IntPtr.Zero);

// For a DRIVE
IntPtr hDrive = NativeMethods.CreateFile(
    string.Format("\\\\.\\{0}:", DriveLetter)
    GenericRead,
    Read | Write,
    IntPtr.Zero,
    OpenExisting,
    0,
    IntPtr.Zero);
然后使用
SetFilePointerEx
(这样可以将偏移量移动到要读取的位置)、
ReadFile
(用从磁盘/驱动器读取的字节填充缓冲区)、
CloseHandle
(关闭CreateFile打开的句柄)

按块读取磁盘/驱动器(因此基本上是从偏移量“0”到偏移量“磁盘/驱动器大小”的循环)


重要的是(或
ReadFile
总是会失败):读取块的大小必须是磁盘扇区大小的倍数(通常为512字节).

您可以使用WMI来实现这一点。.您是否熟悉WMI?实际上,
抽象的全部要点是,它不采用文件系统。您可以同样处理内存流、文件流和串行端口。如果操作系统允许,您可以使用整个磁盘。