[英]How to read a file at a specific offset position using ReadFile() Windows API (C#)?
以下 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
您正在将ReadFile()
的lpOverlapped
参数设置为对_overlapped
变量的引用。 因此,您需要使用_overlapped.Offset
和_overlapped.OffsetHigh
字段来指定要读取的所需文件偏移量。
根据ReadFile()
文档:
[in, out, optional] lpOverlapped
如果使用
FILE_FLAG_OVERLAPPED
打开hFile
参数,则需要指向OVERLAPPED
结构的指针,否则它可以为 NULL。如果使用
FILE_FLAG_OVERLAPPED
打开hFile
,则lpOverlapped
参数必须指向一个有效且唯一的OVERLAPPED
结构,否则该函数可能会错误地报告读取操作已完成。对于支持字节偏移的
hFile
,如果使用此参数,则必须指定开始从文件或设备读取的字节偏移。 通过设置OVERLAPPED
结构的Offset
和OffsetHigh
成员来指定此偏移量。 对于不支持字节偏移的hFile
,Offset
和OffsetHigh
将被忽略。有关
lpOverlapped
和FILE_FLAG_OVERLAPPED
不同组合的更多信息,请参阅备注部分和同步和文件位置部分。
“同步和文件位置”部分说:
如果
hFile
是用FILE_FLAG_OVERLAPPED
打开的,它是一个异步文件句柄; 否则它是同步的。 如前所述,每个使用OVERLAPPED
结构的规则略有不同。...
使用异步文件句柄的注意事项:
- ...
- lpOverlapped 参数不得为 NULL,使用时应牢记以下事实:
- 尽管 OVERLAPPED 结构中指定的事件由系统自动设置和重置,但 OVERLAPPED 结构中指定的偏移量不会自动更新。
- ...
- 因为读取操作从
OVERLAPPED
结构中指定的偏移量开始,并且ReadFile
可能在系统级读取操作完成(读取挂起)之前返回,所以无论是偏移量还是结构的任何其他部分都不应被修改、释放、或由应用程序重用,直到发出事件信号(即读取完成)。- ...
使用同步文件句柄的注意事项:
- ...
- 如果
lpOverlapped
不为 NULL,则读取操作从OVERLAPPED
结构中指定的偏移量开始,并且ReadFile
在读取操作完成之前不会返回。 系统会在ReadFile
返回之前更新OVERLAPPED
偏移量。- ...
如果您将lpOverlapped
参数设置为null
,那么您将不得不使用SetFilePointer()
或SetFilePointerEx()
来指定所需的偏移量:
使用同步文件句柄的注意事项:
- 如果
lpOverlapped
为 NULL,则读取操作从当前文件位置开始,ReadFile
直到操作完成才返回,系统在ReadFile
返回之前更新文件指针。- ...
如果文件实际上支持在特定位置(不是给定位置)读取,您应该能够使用 OVERLAPPED 参数的 Offset 和 OffsetHigh 成员来指定读取位置。
即使没有为重叠 I/O 打开文件,这也应该有效。
我相信您应该能够使用SetFilePointer
或SetFilePointerEx
做到这一点。 它允许您设置文件句柄指向的位置。
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilepointer
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.