Way*_*ide 6 .net c# stream seek
我有一个适用于物理内存快照的应用程序(例如,VMware VMEM文件).除此之外,它还可以通过虚拟而非物理地址从快照中读取进程/模块.这涉及通过页表一次重建4KB模块,这反过来意味着对Stream的Seek()方法的大量调用.
由于我不确定的原因,这些对Seek()的调用使事情陷入困境.因此,我正在寻找一种解决方法 - 或者至少是围绕托管Seek()实现的方法.我最好的猜测是PInvoke SetFilePointer并直接使用它,但为了做到这一点,我需要为Stream获取IntPtr/SafeFileHandle.我有一些限制:
我正在使用的API仅限于.NET 3.5,所以不幸的是MemoryMappedFile不是一个选项.
我不能使用FileStream(已经有一个可以通过反射访问的私有SafeFileHandle字段)或PInvoke CreateFile()以另一种方式获取快照 - 该API包含一个对快照具有独占锁定的BinaryReader.
当然,与FileStream不同,BinaryReader及其底层Stream都没有对文件句柄的引用.但肯定必须存在一个?在这种情况下,我该如何获取它?
没有文件句柄,Stream因为它是一个抽象类。实现的类Stream可能会也可能不会使用文件句柄——FileStream会使用,因为它从文件中读取数据,但是MemoryStream,例如,不会。
要获取 a 的底层文件句柄(在本例中为 a SafeFileHandle),BinaryReader其Stream为 a FileStream,请使用反射来访问private SafeFileHandle _handle,如下所示:
SafeFileHandle sfh = (SafeFileHandle)typeof(FileStream).GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue((FileStream)YOUR_BINARY_READER.BaseStream)
Run Code Online (Sandbox Code Playgroud)
附带说明:在这种情况下,直接致电SetFilePointer()也没有MemoryMappedFile帮助。似乎没有快速的方法来处理我正在使用的卷的随机磁盘访问(数百万个连续调用)。
| 归档时间: |
|
| 查看次数: |
3649 次 |
| 最近记录: |