我有一个闪存卡,需要计算驱动器整个内容的校验和。如何逐点读取整个磁盘的内容
如果我可以获得整个驱动器的流,我可以一点一点读取它。
有没有人知道是否有这样做的API?
到目前为止我看到的一切都需要我打开一个文件。
有什么办法可以一点一点读取整个驱动器的内容?
我有一个闪存卡,需要计算驱动器整个内容的校验和。如何逐点读取整个磁盘的内容
如果我可以获得整个驱动器的流,我可以一点一点读取它。
有没有人知道是否有这样做的API?
到目前为止我看到的一切都需要我打开一个文件。
有什么办法可以一点一点读取整个驱动器的内容?
我不确定在.NET
中是否有直接支持,但可以使用Platform Invoke来调用Win32 API函数。 CreateFile()
应该是你的起点,因为它可以让你获得一个句柄物理驱动器:
您可以使用CreateFile函数打开一个物理磁盘驱动器或卷,其 返回一个直接访问存储设备(DASD)句柄,该句柄可与 DeviceIoControl函数一起使用。这使您可以直接访问磁盘或卷,例如分区表等磁盘元数据。
的文件通知的限制(如需要管理员权限),并提示在如何从卷号一个物理驱动器号,你等
“流”是一个抽象正常假定存在一个文件系统,所以从概念上讲,它不是那么简单。
在Windows上,您可能希望从查看Windows Defragmentation API开始。这里有几个链接,我发现:
实际上,'stream'抽象的全部意义在于它并不假设文件系统。您可以将内存中的流,文件流和串行端口都视为相同。如果操作系统允许你使用整个磁盘。 – MSalters 2012-02-24 10:00:19
如果你想编写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个字节)的扇区大小的倍数。
你可以用WMI来做到这一点..你熟悉WMI吗 – MethodMan 2012-02-23 17:05:58