C# 如何逐位读取整个磁盘的内容
我有一个闪存卡,我需要计算整个硬盘内容的校验和 如果我可以获取整个驱动器的流,我就可以一点一点地读取它 有人知道有没有API可以实现这一点吗 到目前为止,我看到的一切都需要我打开一个文件C# 如何逐位读取整个磁盘的内容,c#,c++,C#,C++,我有一个闪存卡,我需要计算整个硬盘内容的校验和 如果我可以获取整个驱动器的流,我就可以一点一点地读取它 有人知道有没有API可以实现这一点吗 到目前为止,我看到的一切都需要我打开一个文件 有没有办法一点一点地读取整个驱动器的内容?我不确定在.NET中是否有直接的支持,但是您可以使用来调用Win32 API函数。应该是您的起点,因为它允许您获得物理驱动器的句柄: 您可以使用CreateFile函数打开物理磁盘驱动器或卷,其中 返回可与一起使用的直接访问存储设备(DASD)句柄 设备控制功能。这使您
有没有办法一点一点地读取整个驱动器的内容?我不确定在
.NET
中是否有直接的支持,但是您可以使用来调用Win32 API函数。应该是您的起点,因为它允许您获得物理驱动器的句柄:
您可以使用CreateFile函数打开物理磁盘驱动器或卷,其中
返回可与一起使用的直接访问存储设备(DASD)句柄
设备控制功能。这使您能够直接访问磁盘或卷,例如
例如磁盘元数据,如分区表
文档会告知您一些限制(如需要管理权限)并提示如何从卷号中获取物理驱动器号等。流是一种抽象,通常假定存在文件系统,因此从概念上讲,它并不像那样简单
在Windows上,您可能希望从查看Windows碎片整理API开始。以下是我发现的几个链接:
// 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?实际上,流
抽象的全部要点是,它不采用文件系统。您可以同样处理内存流、文件流和串行端口。如果操作系统允许,您可以使用整个磁盘。