请问有人知道如何读取大内存的数据呢?

一只大花猫 2014-01-14 11:17:34
我有个需求,想要读取backup gpt的内容,可是它存储在硬盘扇区的最后面几个扇区里。

我试了几个办法,一是想用SetFilePointer(DiskHandle, -(int)mylength, IntPtr.Zero, FILE_END)将指针指向文件末尾,可是这读取的却是第0个扇区的内容。
还有个笨方法,每次循环一个扇区,然后移动光标,可是这个方法不仅效率有问题,执行结果也有问题。

我听说对于这种大内存的数据,有什么高低位的算法可以解决,可就是不知道高地位怎么算?

我来举个例子,假设我要读取30869504个扇区的内容(每个扇区的内容是512个byte),我该怎么做呢?
...全文
156 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
一只大花猫 2014-01-17
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
SetFilePointer应该可以,问题是你的偏移地址不能是32bit的int,否则只能移动2GB。
啦啦啦 斑竹 我找到了一个好办法,先用deviceIOControl发送IOCTL_DISK_GET_DRIVE_GEOMETRY_EX指令得到具体硬盘容量大小,再转换成16进制,再通过setFilePointer来读取,哈哈。
一只大花猫 2014-01-14
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
SetFilePointer应该可以,问题是你的偏移地址不能是32bit的int,否则只能移动2GB。
感谢版主捧场,请问你知道高低位是怎么算的吗?
threenewbee 2014-01-14
  • 打赏
  • 举报
回复
SetFilePointer应该可以,问题是你的偏移地址不能是32bit的int,否则只能移动2GB。
一只大花猫 2014-01-14
  • 打赏
  • 举报
回复
我用30869503 * 512再转换2进制得到 11,1010,1110,0000,1111,1111,1110,0000,0000 。请问那 SetFilePointer(IntPtr DiskHandle,int lDistanceToMove, IntPtr lpDistanceToMoveHigh, uint dwMoveMethod)函数里的lpDistanceToMoveHigh是不就是 二进制11,十进制3?而lDistanceToMove就是1010,1110,0000,1111,1111,1110,0000,0000,十进制的2920283648? 这样好像不对,反正我这边会报错,也不知道怎么办哎。

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧