下面的c#代码段对二进制文件中的页面执行顺序读取。
出于某些微妙的原因-必须使用ReadFile() Windows系统API。
for (iReadCounter = 0; iReadCounter < iReadCountLimit; iReadCounter++)
{
readsize = DefineConstants.READ_BUF_SIZE;
bool bResult = ReadFile(fhnd, readbuffer, (uint)readsize, out readresult, ref _overlapped);
.
.
}
ReadFile()可以直接读取到一个特定的文件偏移量/位置的选择?谢谢。
/H
如果文件实际上支持在特定位置读取(不是给定的),则应该能够使用OVERLAPPED参数的Offset和OffsetHigh成员来指定读取位置。
即使文件没有因为重叠的I/o而打开,这也应该有效。
设置ReadFile()
的lpOverlapped
参数为对_overlapped
变量的引用。因此,您需要使用_overlapped.Offset
和_overlapped.OffsetHigh
字段来指定要从中读取的所需文件偏移量。
根据ReadFile()
文档:
[in, out, optional] lpOverlapped
如果
hFile
形参以FILE_FLAG_OVERLAPPED
打开,则需要指向OVERLAPPED
结构体的指针,否则可以为NULL。如果用
FILE_FLAG_OVERLAPPED
打开hFile
,则lpOverlapped
参数必须指向一个有效且唯一的OVERLAPPED
结构体,否则函数会错误地报告读操作已经完成。对于支持字节偏移的
hFile
,如果使用此参数,则必须指定开始从文件或设备读取的字节偏移。此偏移量通过设置OVERLAPPED
结构体的Offset
和OffsetHigh
成员来指定。的hFile
不支持字节偏移量,Offset
和OffsetHigh
忽略。有关
lpOverlapped
和FILE_FLAG_OVERLAPPED
的不同组合的更多信息,请参见备注部分和同步和文件位置部分。
和"同步和文件位置"节说:
如果
hFile
以FILE_FLAG_OVERLAPPED
打开,则为异步句柄;否则是同步的。如前所述,每种OVERLAPPED
结构的使用规则略有不同。…
使用异步文件句柄的注意事项:
- …
- lpoverlap参数不能为NULL,使用时应牢记以下事实:
- 虽然OVERLAPPED结构中指定的事件由系统自动设置和重置,但是OVERLAPPED结构中指定的偏移量不会自动更新。
- …
- 因为读取操作从
OVERLAPPED
结构中指定的偏移量开始,并且ReadFile
可能在系统级读操作完成之前返回(读挂起),在事件发出信号(即读完成)之前,偏移量和结构的任何其他部分都不应该被修改、释放或被应用程序重用。- …
使用同步文件句柄的注意事项:
- …
- 如果
lpOverlapped
不为NULL,则读取操作从OVERLAPPED
结构中指定的偏移量开始,ReadFile
直到读取操作完成才返回。在ReadFile
返回之前,系统更新OVERLAPPED
偏移量。- …
如果将lpOverlapped
参数设置为null
,则必须使用SetFilePointer()
或SetFilePointerEx()
来指定所需的偏移量:
使用同步文件句柄的注意事项:
- 如果
lpOverlapped
为NULL,读取操作从当前文件位置开始ReadFile
在操作完成后才返回,系统在ReadFile
返回前更新文件指针。- …
我相信你应该能够做到这一点与SetFilePointer
或SetFilePointerEx
。它允许你设置文件句柄指向的位置。
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilepointer