繁体   English   中英

如何使用 ReadFile() Windows API (C#) 在特定偏移位置读取文件?

[英]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结构的OffsetOffsetHigh成员来指定此偏移量。 对于不支持字节偏移的hFileOffsetOffsetHigh将被忽略。

有关lpOverlappedFILE_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 打开文件,这也应该有效。

我相信您应该能够使用SetFilePointerSetFilePointerEx做到这一点。 它允许您设置文件句柄指向的位置。

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilepointer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM