如何读取一个文件在一个特定的偏移位置使用ReadFile() Windows API (c#)? &g



下面的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结构体的OffsetOffsetHigh成员来指定。hFile不支持字节偏移量,OffsetOffsetHigh忽略。

有关lpOverlappedFILE_FLAG_OVERLAPPED的不同组合的更多信息,请参见备注部分和同步和文件位置部分。

和"同步和文件位置"节说:

如果hFileFILE_FLAG_OVERLAPPED打开,则为异步句柄;否则是同步的。如前所述,每种OVERLAPPED结构的使用规则略有不同。

使用异步文件句柄的注意事项:

  • lpoverlap参数不能为NULL,使用时应牢记以下事实:
    • 虽然OVERLAPPED结构中指定的事件由系统自动设置和重置,但是OVERLAPPED结构中指定的偏移量不会自动更新
    • 因为读取操作从OVERLAPPED结构中指定的偏移量开始,并且ReadFile可能在系统级读操作完成之前返回(读挂起),在事件发出信号(即读完成)之前,偏移量和结构的任何其他部分都不应该被修改、释放或被应用程序重用。

使用同步文件句柄的注意事项:

  • 如果lpOverlapped不为NULL,则读取操作从OVERLAPPED结构中指定的偏移量开始,ReadFile直到读取操作完成才返回。在ReadFile返回之前,系统更新OVERLAPPED偏移量。

如果将lpOverlapped参数设置为null,则必须使用SetFilePointer()SetFilePointerEx()来指定所需的偏移量:

使用同步文件句柄的注意事项:

  • 如果lpOverlapped为NULL,读取操作从当前文件位置开始ReadFile在操作完成后才返回,系统在ReadFile返回前更新文件指针。

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

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

最新更新