【发布时间】:2012-02-24 01:43:15
【问题描述】:
我有一张闪存卡,我需要计算驱动器全部内容的校验和。
如果我可以获取到整个驱动器的流,我可以一点一点地读取它。
有谁知道是否有用于执行此操作的 API?
到目前为止,我看到的所有内容都需要我打开一个文件。
有没有办法一点一点地读取整个驱动器的内容?
【问题讨论】:
-
你可以使用 WMI 来做到这一点。你熟悉 WMI
我有一张闪存卡,我需要计算驱动器全部内容的校验和。
如果我可以获取到整个驱动器的流,我可以一点一点地读取它。
有谁知道是否有用于执行此操作的 API?
到目前为止,我看到的所有内容都需要我打开一个文件。
有没有办法一点一点地读取整个驱动器的内容?
【问题讨论】:
如果您想编写 C# 代码,则必须使用 P/Invoke 从磁盘读取数据(RAW 访问)。
有什么方法可以一点一点地读取整个驱动器的内容吗?
您必须区分 驱动器(闪存卡的逻辑表示,上面安装了文件系统,由 驱动器指定字母)和磁盘(您的闪存卡的物理表示,由磁盘编号指定)。
请参阅my previous answer,了解如何从驱动器/磁盘读取 RAW 数据:
基本上,您首先需要磁盘/驱动器的句柄:
// 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 字节)。
【讨论】:
我不确定.NET 是否直接支持此功能,但您可以使用Platform Invoke 调用 Win32 API 函数。 CreateFile() 应该是您的起点,因为它允许您获取物理驱动器的句柄:
您可以使用 CreateFile 函数打开物理磁盘驱动器或卷,这 返回可与 DeviceIoControl 函数。这使您可以直接访问磁盘或卷,例如 例如分区表等磁盘元数据。
该文档会告知您限制(例如需要管理权限)并提示如何从卷号中获取物理驱动器号等。
【讨论】:
“流”是一种抽象,通常假定存在文件系统,因此从概念上讲它并不那么简单。
在 Windows 上,您可能需要先查看 Windows 碎片整理 API。以下是我找到的几个链接:
【讨论】:
stream 抽象的全部意义在于它不假设一个文件系统。您可以对内存中的流、文件流和串行端口一视同仁。如果操作系统允许,整个磁盘。